事务传播行为是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