Spring事务传播行为
作为Java开发者,面试中被问到Spring事务传播机制的概率非常高。今天我们就来系统梳理这个必考点,助你面试时对答如流!
一、什么是事务传播行为?
简单说就是当多个事务方法相互调用时,Spring如何处理这些事务边界。比如方法A调用方法B,B是否需要新开事务?还是加入A的事务?这就是事务传播行为决定的。
Spring定义了7种传播行为,最常见的是这三个:
- PROPAGATION_REQUIRED(默认)
如果当前存在事务,则加入;没有就新建 - PROPAGATION_REQUIRES_NEW
无论当前是否有事务,都新建事务 - PROPAGATION_SUPPORTS
有事务就加入,没有就以非事务执行

二、高频面试场景解析
场景1:
面试官问:"ServiceA.methodA()调用ServiceB.methodB(),两个方法都加了@Transactional,B抛异常会影响A吗?"
👉 这要看B的传播行为设置:
- 如果B用默认的REQUIRED:A和B在同一个事务,B异常会导致整个事务回滚
- 如果B用REQUIRES_NEW:B会启新事务,B回滚不影响A
场景2:
"如何让子方法执行后立即提交事务?"
👉 用REQUIRES_NEW!比如记录操作日志的场景,即使主业务失败,日志仍需入库
三、避坑指南
-
嵌套事务不是真的嵌套
MySQL不支持真正的嵌套事务,Spring的嵌套事务是通过保存点(SavePoint)实现的 -
REQUIRES_NEW的陷阱
新事务会挂起原事务,数据库连接数可能暴增,大并发场景慎用 -
@Transactional失效场景
- 方法非public
- 同类方法调用(走代理对象可解)
- 异常类型不匹配(默认只回滚RuntimeException)
四、这样回答面试官
当被问到实际应用时,可以这样答:
“我们在电商下单场景这样设计:支付服务用REQUIRES_NEW,这样即使支付失败,主订单事务回滚,但支付日志仍能独立记录。而库存服务用默认的REQUIRED,保证扣减库存和创建订单在同一个事务”
📌 2025最新面试资料:
点击获取Java面试宝典
提取码: 9b3g
需要系统化备战面试?通过面试鸭返利网购买会员可享25元返利!海量真题+专家解析助你通关:

本文首发于面试鸭返利网,转载请注明出处


