Spring 事务传播行为有几种

2025年Java面试宝典:
链接: <font color='blue'>https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g</font> 提取码: 9b3g
为什么事务传播行为是高频面试题?
每次面试问到Spring事务,面试官总会盯着传播行为不放。这个知识点看似简单,但实际开发中如果理解不透,很容易导致事务失效、数据不一致等问题。尤其在分布式场景下,不同的传播行为直接决定了多个事务方法如何协同工作。
Spring 事务传播行为的7种类型
Spring官方文档明确定义了7种事务传播行为,下面我用最直白的语言帮你梳理清楚它们的区别和应用场景。
1. PROPAGATION_REQUIRED(默认行为)
这是最常用的传播行为。如果当前没有事务,就新建一个事务;如果已经存在事务,就加入这个事务。比如你在方法A调用了方法B,如果B用了REQUIRED,那么B会和A在同一个事务里执行。面试时可以说:“这个方法就像团队协作,有活一起干,有锅一起背”。
2. PROPAGATION_SUPPORTS
如果当前存在事务,就加入事务;如果不存在,就以非事务方式执行。比如查询接口可以用这个行为,但要注意:如果上游有事务,你的查询也会被锁表!建议搭配只读事务使用更安全。
3. PROPAGATION_MANDATORY
强制要求当前必须存在事务,否则直接抛异常。这种传播行为就像霸道总裁,必须有人带着它玩。常见于需要严格保证事务完整性的场景,比如资金结算的二级方法。

4. PROPAGATION_REQUIRES_NEW
无论当前有没有事务,都新建一个独立事务。面试时要特别注意:新事务会挂起原有事务,两个事务完全独立,可能出现部分提交的情况。比如日志记录场景,即使主事务回滚了,日志还是要保存的。
5. PROPAGATION_NOT_SUPPORTED
以非事务方式执行,如果当前存在事务,就把事务挂起。这种模式适合那些不需要事务但又可能被包含在事务方法里的场景,比如发送短信验证码。
6. PROPAGATION_NEVER
强制要求当前不能存在事务,否则直接抛异常。相当于事务绝缘体,适用于严格禁止事务影响的场景,比如某些性能敏感的统计计算。
7. PROPAGATION_NESTED
在现有事务内创建嵌套事务,这是最容易被误解的传播行为。嵌套事务的特点在于能实现部分回滚——如果子事务失败,可以不影响主事务。但要注意:这种模式需要数据库支持保存点(比如MySQL的InnoDB引擎)。
实战避坑指南
- 不要滥用REQUIRES_NEW:虽然它能解决部分问题,但频繁创建新事务会导致数据库连接池吃紧
- 嵌套事务不等于分布式事务:PROPAGATION_NESTED仍然是单数据库的事务
- 跨Service调用时,传播行为可能因为AOP代理失效
- 非public方法的事务注解不会生效(这点很多人栽跟头)

如何应对面试追问?
当面试官问完7种传播行为后,通常会跟进这些问题:
- 分布式事务和本地事务的区别是什么?
- 什么场景下必须用REQUIRES_NEW?
- 嵌套事务回滚后,外层事务还能提交吗?
- 事务传播行为和隔离级别的区别?
- 遇到过事务失效的场景吗?怎么解决的?
建议结合具体项目案例回答,比如:“在我们的支付系统中,充值主流程用REQUIRED,积分赠送用REQUIRES_NEW,这样即使积分服务挂了,也能保证资金操作正常完成”。
需要Java面试资料的同学可以保存这份网盘资源:
<font color='blue'>链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g</font>
如果准备购买面试鸭会员,通过面试鸭返利网找我可返25元。系统掌握事务传播机制,面试遇到这类问题就能对答如流了!


