Spring的事务传播行为
简单来说,它决定了多个事务方法互相调用时,事务应该如何传递。比如,方法 A 调用了方法 B,这时 Spring 需要明确:B 是否要加入 A 的事务?还是自己独立开一个新事务?或者完全不开启事务?这就是传播行为要解决的问题。
通俗场景举例
假设你去银行转账:
- 主业务:从账户 A 转 100 元到账户 B(方法 A)。
- 子操作:记录转账日志(方法 B)。
如果转账失败,你希望日志记录也回滚吗?
- 如果希望回滚:日志记录(方法 B)加入主事务(方法 A)一起回滚。
- 如果不希望回滚:日志记录(方法 B)独立开启新事务,即使转账失败,日志依然保存。
传播行为就是用来控制这种“事务边界”的规则!
常见的传播行为(重点掌握前3种)
- REQUIRED(默认)
- 规则:如果当前有事务,就加入;没有事务,就新建一个。
- 举例:转账(A)和日志(B)用同一个事务,A 失败,B 也回滚。
- REQUIRES_NEW
- 规则:无论如何都新建事务,原事务挂起,新事务独立提交或回滚。
- 举例:日志记录(B)用新事务,即使转账(A)失败,日志依然保存。
- SUPPORTS
- 规则:有事务就加入,没有就不开启事务。
- 举例:查询操作(B),如果调用方(A)有事务则加入,否则非事务执行。
- 其他(了解即可)
- NOT_SUPPORTED:强制非事务执行,原事务挂起。
- MANDATORY:强制调用方必须有事务,否则抛异常。
- NEVER:强制调用方必须无事务,否则抛异常。
- NESTED:嵌套事务(依赖于数据库支持),子事务可独立回滚。
为什么需要传播行为?
- 保证数据一致性:避免多个操作互相干扰(比如错误覆盖或错误提交)。
- 灵活控制事务边界:根据业务需求,决定哪些操作要一起成功/失败,哪些要独立。
一句话总结:
传播行为就像交通规则,告诉事务方法在互相调用时,是“挤一辆车”(共用事务)还是“自己开车”(独立事务),确保数据操作安全有序。