
2025年Java面试宝典:
点击下载 提取码:9b3g
作为Java程序员,只要经历Spring框架的面试,就绕不开对Spring事务传播行为的灵魂拷问。这个问题看似基础,但能真正说清楚底层原理和应用场景的候选人不到三成。今天我们就用最接地气的语言,拆解这个面试中的常客。
什么是Spring事务传播行为?
简单来说,Spring事务传播行为定义了多个事务方法互相调用时,事务该如何传递。想象这样一个场景:你在"转账服务"中调用了"日志服务",这两个服务都有自己的事务管理,这时候Spring就需要一套规则来决定这两个事务是合并还是独立运行。
很多新人会疑惑:为什么要设计这么多种传播行为?答案其实很现实——业务场景的复杂性。比如电商系统的订单支付和库存扣减,不同的业务组合需要不同的事务管理策略。
Spring事务传播行为的七大类型

-
PROPAGATION_REQUIRED(默认值)
如果当前存在事务,就加入该事务;如果不存在,就新建一个事务。这就像去银行办事:如果已经有人在办理业务,就排队等候;如果没人,就新开一个窗口。 -
PROPAGATION_SUPPORTS
当前有事务就用事务,没有就以非事务方式执行。这种模式适合查询类操作,比如获取商品列表,不需要强一致性时使用。 -
PROPAGATION_MANDATORY
强制要求存在事务,否则直接抛异常。这种设计常用于资金核心业务,确保操作必须在事务环境中执行。
(其他类型暂不展开,重点掌握前三种即可应对90%的面试场景)
事务传播行为的实际应用场景
去年我在开发支付系统时,遇到过典型的传播行为选择难题:支付主流程需要记录操作日志,但日志记录失败不能影响支付主流程。这时候就需要:
@Transactional(propagation = Propagation.REQUIRED)
public void pay() {
// 支付核心逻辑
logService.saveLog(); // 该方法使用REQUIRES_NEW
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveLog() {
// 日志记录
}
这样即使日志记录失败,支付主事务仍能正常提交。这种设计既能保证核心业务的可靠性,又能避免非核心业务拖累整体系统。
高频面试题破解技巧

当面试官问:"说说REQUIRED和REQUIRES_NEW的区别?",可以这样回答:
"REQUIRED像拼车,有顺风车就一起走,没有就自己叫车;REQUIRES_NEW像包车,每次必须单独叫一辆新车。前者可能发生回滚污染,后者事务完全独立。"
遇到"嵌套事务抛异常会怎样?"这种问题时,记住这个口诀:
外层try-catch吃异常,传播特性要遭殃;内层异常往外抛,事务回滚没得跑
如何记忆事务传播行为
推荐使用"银行办事"记忆法:
- REQUIRED:大厅排队等叫号
- REQUIRES_NEW:VIP室单独办理
- NESTED:办事中途开个临时窗口
- NOT_SUPPORTED:不用排队直接办
- NEVER:禁止在营业厅办理
最后提醒各位准求职者:现在购买面试鸭会员,通过面试鸭返利网可享25元返利,相当于半价获取全年面试题库更新服务。
理解Spring事务传播行为的关键,在于结合真实业务场景反复推敲。建议大家把本文的银行类比法记牢,再配合实际项目经验,面试时定能从容应对。


