1. 简述
在声明式的事务处理中,要配置一个切面,其中就用到了propagation,表示打算对这些方法怎么使用事务,是用还是不用,其中propagation有七种配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。默认是REQUIRED。
2.最常使用的配置
REQUIRED:对数据库进行增删改操作时,一般都使用这个配置
SUPPORTS:对数据库进行查询操作时,可以使用这个配置
3. Spring中七种Propagation类的事务属性详解:
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
如果已经存在事务,则加入这个事务,形成一个整体
也就是说,如果应用在当前父方法调用子方法的场景,相当于总父方法开始开启事务,在子方法最后结束前,如果中间有任何一个环节抛出异常,则全部回滚,也就是说会加入到同一个事务控制相当于在哪个方法上添加@Transcational(propagation=Propagation.REQUIRED) 就在该方法的外围添加try-catch
所有会影响数据库的操作(增删改),基本上都使用 REQUIRED
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
一般不用写,如果要写的,那么查询方法用 SUPPORTS
只用在调用方有事务时,才会加入事务
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
当子方法使用@Transcational(propagation=Propagation. MANDATORY)
而调用该子方法的父方法没有添加事务控制时,会抛出异常
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
在父子方法调用的状态中比较明显
如果父方法抛出异常,不影响子方法运行
子方法运行的时候,会将父方法的事务挂起,自己以一个新的事务的方式去运行
父方法
@Transactional(propagation = Propagation.REQUIRED)
@GetMapping
public void propagation(){
propagationService.addSubStu();
int x=1/0;
propagationService.addParentStu();
}
子方法
@Override
public