什么是事务传播特性
简单理解 即 A方法调用B方法时,B方法的事务应该如何执行
例如:转账案例 转出 与 转入 拆封成两个方法,当转出方法去调用转入方法时,转入方法的事务应该如何去控制
Spring事务的七大传播级别
spring给出的七大传播级别,总结 共分为三大类如下
死活不要事务
- Propagation.NEVER 没有事务就非事务正常运行,如果有事务则抛出异常

- Propagation.NOT_SUPPORTED 没有事务就非事务运行,如果存在A方法存在事务,就挂起A方法的事务,B方法(被调用者)已非事务的方式运行。如果A、B方法操作的同一张表,且SQL没有走索引,会导致表锁,如果走了索引则是行级锁,表锁会导致A中事务挂起等待,B尝试获取锁却无法获得出现死锁的情况,最终会导致锁等待异常,可在注解中设置超时时间

可有可无型
propagation = Propagation.SUPPORTS A方法有事务B方法就跟A使用同一个事务,A方法没有事务则以非事务运行
必须得有事务型
- Propagation.REQUIRES_NEW A方法没有事务则B就新建事务,此时B回滚A不回滚,若A方法有事务则挂起A的事务,B方法新建事务。
- Propagation.NESTED 如果A方法有事务,则在A方法的事务里面嵌套新建一个事务,如果A方法没有事务,则B方法新建事务 嵌套事务:当大事务(A方法)出现异常全部回滚,当子事务(B方法)出现异常 仅回滚子事务,大事务不受影响
- Propagation.REQUIRED Spring的默认事务传播级别,如果没有就新建事务,如果有则加入当前事务(满足大部分使用场景)
- Propagation.MANDATORY 没有事务则抛出异常,有事务则加入当前事务

评论区