Spring事务的传播行为

2025年Java面试宝典免费领取:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
最近在面试鸭返利网的社招辅导中,发现至少30%的同学会被问到Spring事务传播行为的问题。很多小伙伴虽然能背出七种传播机制的名称,但在实际场景中还是容易混淆。今天咱们用真实面试场景拆解这个知识点,帮你彻底搞懂传播行为到底怎么用。
为什么传播行为这么重要?
Spring事务的传播行为决定了多个事务方法相互调用时,事务应该如何传递。比如老张调用了老李的方法,这时候事务是合并成一个还是分开处理?不同的选择直接影响数据一致性和系统性能。

去年我们团队就踩过一个坑:在嵌套事务中错误使用了REQUIRED传播,导致资金流水出现重复扣款。所以理解传播行为不仅是为了面试,更是实际开发中的必备技能。
七种传播机制详解
这七种传播行为可以分为三大类来记忆,这样面试时不容易漏项:
-
必须要有事务组
- REQUIRED(默认值):有就用现有的,没有就新建
- MANDATORY:必须存在事务,否则抛异常
-
不要事务组
- REQUIRES_NEW:每次都开新事务
- NEVER:拒绝事务环境
- NOT_SUPPORTED:挂起当前事务
-
佛系组
- SUPPORTS:有就用,没有就算了
- NESTED:嵌套子事务(需要数据库支持SAVEPOINT)
举个例子:用户注册后自动发放优惠券。如果注册失败,但优惠券发放成功了,这就是典型的传播行为配置错误。这时候应该用REQUIRED而不是SUPPORTS。
高频面试问题破解
根据面试鸭返利网统计的真题库,这三个问题出现频率最高:
Q1:REQUIRES_NEW和NESTED区别在哪?
答:REQUIRES_NEW是完全独立的新事务,父事务回滚不影响它。而NESTED是嵌套事务,父事务回滚会导致子事务回滚,但子事务可以单独回滚不影响父事务。注意不是所有数据库都支持NESTED!
Q2:事务方法调用同类方法为何失效?
答:这是典型的代理失效问题。Spring事务基于AOP实现,同类内部方法调用不会走代理。解决方法有三种:自我注入、拆分到其他类、使用AspectJ编译时织入。
Q3:异步方法如何搭配传播行为?
答:异步线程会开启新的事务上下文。如果用@Async+REQUIRED,会创建新事务。如果要和主事务关联,需要配置事务传播链,建议配合TransactionTemplate使用。

避坑指南
- 线上环境务必测试事务回滚是否生效
- 跨数据源事务要配置JTA分布式事务管理器
- 注意@Transactional注解继承问题(接口和实现类的关系)
- 监控事务超时时间,防止长事务拖垮数据库
需要购买面试鸭会员的同学注意,通过面试鸭返利网找我下单可返现25元,相当于官方价打7折。我们已经帮300+学员用这个方法省下了会员费。
本文提到的面试真题在《2025Java面试宝典》中都有详细解析,需要完整版的同学记得取开头的网盘链接。下期我们聊聊分布式事务的最终一致性实现,关注面试鸭返利网获取最新技术解析!


