Spring事务(三)-事务传播行为
在Spring里,一个事务方法被另外一个事务方法调用时,两个方法的事务应该如何进行,说白话一点,就是说当出现异常需要回滚时,各个方法的数据操作是否要全部回滚,事务传播行为就是决定了这样的一个处理结果。A事务方法(外部方法)调用了B事务方法(内部方法,又叫被调用方法),B是继续在A的事务中运行呢?还是为自己另开一个新事务运行呢?这就是由B的事务传播行为决定的。
@Transactional
注解通过propagation属性设置事务事务传播行为,如下:
@Transactional(propagation = Propagation.REQUIRED)
public void method(){}
Spring的事务传播行为一共有7种:
1、REQUIRED
这是默认传播行为。如果当前没有事务,就新建一个事务。如果当前已经存在事务,就加入到这个事务中。这个当前事务指的是外部方法本身的事务。
2、REQUIRES_NEW
开启一个新的事务。如果当前已经存在事务,则先将这个存在的事务挂起。( 当类A中的 a 方法用默认Propagation.REQUIRED模式,类B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中调用 b方法操作数据库,然而 a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停 a方法的事务。 )
3、SUPPORTS
如果当前存在一个事务,就加入到这个事务中。如果当前没有事务,则非事务方式执行。
4、MANDATORY
如果当前存在一个事务,就加入到这个事务中。如果当前没有开启事务,则抛出异常。
5、NOT_SUPPORTED
总是非事务方式执行,并挂起任何存在的事务。
6、NEVER
非事务方式运行,当前存在事务抛出异常。
7、NESTED
如果当前存在一个事务,则运行在一个嵌套的事务中。 如果当前没有开启事务, 则按 REQUIRED 属性执行。这里所说的“运行在一个嵌套的事务中”,其实就是说运行在外层事务的子事务中,这个子事务有单独的保存点,因此,当内部方法抛异常时,不会影响到外部方法的事务,也就是说,外部方法的数据操作仍然可以提交。