在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 属性执行。这里所说的“运行在一个嵌套的事务中”,其实就是说运行在外层事务的子事务中,这个子事务有单独的保存点,因此,当内部方法抛异常时,不会影响到外部方法的事务,也就是说,外部方法的数据操作仍然可以提交。