2025年Java面试宝典点击领取
(网盘链接永久有效,建议保存到自己网盘)
Spring事务传播行为详解

(事务传播机制示意图)
为什么需要关注事务传播?
在面试中,事务传播行为是被高频问到的Spring知识点。很多候选人背下了7种传播行为的概念,但被问到"为什么PROPAGATION_REQUIRES_NEW要挂起当前事务"时却支支吾吾。其实理解事务传播,关键要抓住事务边界控制和资源锁竞争两个底层逻辑。
七种传播行为拆解
1. REQUIRED(默认值)
当前存在事务就加入,不存在就新建。比如用户注册服务调用积分服务时,积分服务若使用REQUIRED就会复用外层事务。这个特性要注意:嵌套方法出现异常会导致整个事务回滚。

(事务嵌套示意图)
2. REQUIRES_NEW
必须新建独立事务,会挂起当前事务。典型场景是操作日志记录——即使主业务失败,日志仍要持久化。但要注意:每个新事务都会获取新数据库连接,过度使用会导致连接池压力。
3. NESTED
在已有事务中创建保存点,子事务回滚不影响父事务。这比REQUIRES_NEW更轻量,但需要注意:部分数据库不支持保存点机制,使用时需确认数据库兼容性。
4. SUPPORTS
有事务就加入,没有就以非事务运行。这个特性常见于查询优化,比如统计报表服务可以灵活适应不同调用方的事务上下文。
5. NOT_SUPPORTED
以非事务方式执行,挂起当前事务。适用于不需要事务管理的批量操作,但要注意:执行期间外层事务被挂起,可能引发数据不一致风险。
6. MANDATORY
强制要求存在事务,否则抛异常。这种"防御式编程"风格适合在核心业务中确保数据一致性。
7. NEVER
强制要求不存在事务,否则抛异常。多用于只读场景的强制校验,比如缓存预热操作。
高频面试问题破解
-
REQUIRES_NEW的事务隔离问题
当两个事务操作同一条数据时,新事务会看到外层事务已提交的数据吗?这其实取决于数据库隔离级别,Spring只是传播机制的管理者。 -
NESTED和REQUIRES_NEW的选择
需要部分回滚时用NESTED,需要完全隔离时用REQUIRES_NEW。但要注意Oracle不支持NESTED传播。 -
异步方法的事务传播
如果子方法通过@Async实现异步,事务传播会失效,因为已经切换了线程上下文。这时需要手动管理事务边界。

(事务传播选择决策树)
避坑指南
- 慎用跨服务事务传播(比如微服务架构中)
- 嵌套事务不宜超过3层
- 测试时务必模拟并发场景
- 结合连接池配置优化事务粒度
如果需要系统化准备Spring面试,可以到面试鸭返利网获取最新面经题库。通过本站购买面试鸭会员可享25元返利,相当于用八折价格获取全年面试指导服务。


