Spring 事务传播原理:面试中如何讲透底层机制?

2025年Java面试宝典:
点击领取(提取码:9b3g)
一、为什么事务传播机制是面试必考点?
在分布式系统开发中,80%的事务异常都源于传播行为配置不当。面试官抛出这个问题的真实意图是:
- 考察你是否理解不同场景下的业务边界
- 验证是否具备事务设计思维
- 测试对Spring源码的熟悉程度
举个真实案例:用户支付完成后同时发放积分,如果积分服务抛出异常导致支付回滚,这就是典型的传播行为配置错误。
二、7种传播行为到底在传播什么?

记住这张关系图,我们拆解核心差异点:
| 传播类型 | 关键特征 | 适用场景 | |------------------|-----------------------------|------------------------| | REQUIRED(默认) | 加入已有事务或新建 | 普通增删改操作 | | REQUIRES_NEW | 始终新建独立事务 | 重要日志记录 | | NESTED | 创建保存点实现部分回滚 | 批量操作中的子任务 | | NOT_SUPPORTED | 非事务方式运行 | 查询优化 | | SUPPORTS | 有事务就跟,没有就不跟 | 兼容性处理 |
三、底层实现三大支柱
-
逻辑事务与物理事务的映射
每个@Transactional对应一个逻辑事务,多个逻辑事务可能共享同一个数据库连接(物理事务) -
TransactionSynchronizationManager
通过ThreadLocal存储当前事务上下文,这也是为什么异步线程会丢失事务上下文的关键原因 -
AbstractPlatformTransactionManager
模板方法模式实现事务生命周期管理,不同传播行为对应不同的事务创建/获取策略
四、面试应答技巧
当被问到:"REQUIRES_NEW和NESTED有什么区别?" 不要直接背概念,这样回答更出彩:
"这两种传播行为都涉及事务嵌套,但底层机制完全不同。REQUIRES_NEW会创建新物理事务,完全独立提交;而NESTED是通过保存点机制实现的逻辑嵌套,外层事务回滚会导致内层一起回滚。举个例子:订单创建用REQUIRED,扣库存用REQUIRES_NEW,这样库存操作失败不会影响主订单;但如果用NESTED,主订单回滚会导致库存回滚。"
五、高频踩坑点剖析
-
异步线程丢失事务上下文
解决方法:手动传递TransactionContext -
try-catch吞异常导致不回滚
必须抛出RuntimeException或配置rollbackFor -
非public方法失效
Spring AOP的先天限制 -
多数据源配置混淆
务必指定transactionManager
备考福利:通过面试鸭返利网购买面试鸭会员可返现25元,海量技术题库+大厂真题助你备战金九银十。

记住:理解传播机制的核心是把握事务边界控制,不同的业务场景需要不同的隔离策略。建议结合Spring源码中的TransactionAspectSupport类加深理解,这才是面试加分的关键!


