Spring事务传播行为实现原理

2025年Java面试宝典(点击下载):
百度网盘链接
提取码:9b3g
为什么面试总问Spring事务传播行为?
无论是社招还是校招,Spring事务传播行为都是高频面试题。面试官想考察候选人是否真正理解Spring事务的实现原理,而不仅仅是背概念。比如"REQUIRED和REQUIRES_NEW的区别"这种基础题,能答出具体执行过程才算过关。
事务传播行为的七个类型
Spring定义了7种传播行为,最常用的是:
- PROPAGATION_REQUIRED(默认):有事务则加入,没有则新建
- PROPAGATION_REQUIRES_NEW:新建独立事务,挂起当前事务
- PROPAGATION_NESTED:嵌套事务(依赖Savepoint机制)

建议熟记这几种类型的适用场景,比如跨服务调用用REQUIRES_NEW,资金操作主业务用REQUIRED等。
Spring事务的实现骨架
整个事务体系依赖三个核心组件:
- PlatformTransactionManager:事务管理器接口
- TransactionDefinition:定义传播行为、隔离级别等属性
- TransactionStatus:记录事务状态
当面试被问到"Spring事务如何实现不同传播行为"时,可以这样回答:
"底层是通过AOP代理拦截带有@Transactional注解的方法,在调用链中通过ThreadLocal保存事务上下文,结合具体的事务管理器实现不同传播策略。"
关键实现机制拆解
事务管理器的选择
Spring通过适配器模式兼容多种数据源。例如:
- JDBC用DataSourceTransactionManager
- JPA用JpaTransactionManager
- Hibernate用HibernateTransactionManager
线程级事务上下文
使用ThreadLocal存储TransactionInfo对象,保证事务上下文在调用链中正确传递。这是实现嵌套事务的核心。
事务同步器
TransactionSynchronizationManager负责绑定资源(如数据库连接),不同传播行为会触发不同的资源绑定策略。

例如REQUIRES_NEW传播时:
- 挂起当前事务
- 新建数据库连接
- 开启新事务
- 方法执行完毕释放新连接
- 恢复原有事务
高频面试问题避坑指南
Q:NESTED传播和REQUIRES_NEW有什么区别?
A:NESTED使用的是Savepoint机制(部分数据库支持),回滚时只回滚到保存点,外层事务不受影响;而REQUIRES_NEW是完全独立的事务。
Q:哪些情况会导致事务失效?
A:重点检查这三点:
- 方法非public
- 自调用(绕过AOP代理)
- 异常类型未声明回滚
如何应对原理类追问?
当面试官问:"能具体说说事务同步器怎么实现不同传播行为吗?",可以这样回答:
"以REQUIRED为例,在进入方法时会先检查当前线程是否存在事务。如果存在,则复用现有事务,否则通过DataSourceUtils获取新连接。而REQUIRES_NEW会强制挂起当前事务,通过doBegin()方法创建新事务,并绑定新连接到线程上下文。"
获取更多面试资料:
需要购买面试鸭会员的小伙伴,通过面试鸭返利网联系我可返25元。已帮助200+同学拿到大厂offer,最新题库实时更新!


