事务传播行为,指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。
比如事务a方法调用事务b方法,b是继续在调用者a的事务中运行呢?还是为自己另开一个新事物运行?这就是由b的事务传播行为决定的。
Spring事务传播行为一共有七种:
1.REQUIRED
它是默认传播行为,支持当前事务,如果当前没有事务,就新建一个事务,不管有几个事务存在,都合并成一个事务来处理,只要有一个事务抛出异常,所有事务都会回滚。
A方法和B方法都有事务,A方法调用B方法,A的事务会传递给B,使它们共用同一个事务。
2.SUPPORTS
如果存在一个事务,支持当前事务,如果没有事务,则非事务执行。
a方法有事务,b就用a的事务,a方法没有事务,b就用非事务的执行代码。
3.REQUIRES_NEW
开启一个新的事务,如果一个事务已经存在,则先将这个存在的事务挂起
a方法调用b方法,b会开启一个新的事务来执行代码,此时a需要先挂起当前事务,等待b事务执行完毕再重新开启a方法事务。
4.MANDATORY
如果已经存在一个事务,支持当前事务,如果没有一个活动的事务,则抛出异常
a方法有事务,a,b就共用a的事务,如果controller直接调用b方法且b没有事务,则b会抛出异常
5.NOT_SUPPORTED
总是非事务的执行,并且挂起任何存在的事务
a方法调用b方法,b会非事务的执行代码,此时a需要先挂起事务等待b执行完代码再重新开启a事务。
6.NEVER
总是非事务地执行,不加入任何事务,如果存在一个活动事务,则抛出异常
方法b总是非事务的执行代码,如果a方法有事务且调用b方法,则b会抛出异常。
7.NESTED
如果一个活动事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按照REQUIRED属性执行。
如果方法a调用方法b且a有事务,方法a代码抛异常,则a,b都会回滚事务,如果a没有事务,新建一个事务,但此时b代码抛出异常,只有b事务回滚。