Spring7种事务传播行为及分组记忆法

事务传播行为是Spring框架提供的事务增强特性,他不属于事务实际提供方即数据库的行为。所谓的事务传播行为指的是事务在多个方法的调用中是如何传递的,用来决定事务到底是重新创建还是直接复用上层事务等。

Spring在TransactionDefinition接口中规定了7种事务传播行为。(对应到@Transactional注解中的Propagation属性为Propagation这个枚举类)

下表是具体的传播行为类型及说明:

PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务;如果已经存在一个事务,则加入到这个事务中。(默认情况)
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

看到这么多英文加描述就头疼,不过我们可以分组进行记忆:

2个require:

一定会有事务,有new的比较勤快一定会自己建事务;没new的比较懒,有事务就用没事务才自己建。

2个support:

比较佛系,有就用没有就不用;加了not就变得任性,就是不要事务。

2个异常:

mandatory强行要有,没有就抛异常;never强行不要,有就抛异常。

1个嵌套:

有则新建嵌套事务;无则新建普通事务。

参考资料:

https://segmentfault.com/a/1190000013341344

https://blog.csdn.net/qq_26323323/article/details/81908955