springboot的事务传播机制
Spring 定义了 7 种事务传播行为(枚举Propagation),核心解决 “方法 A 调用方法 B 时,B 的事务如何和 A 的事务交互” 的问题
1. 核心场景:嵌套方法调用
@Service
public class ServiceA {
@Transactional // A有事务
public void methodA() {
serviceB.methodB(); // 调用B的方法
}
}
@Service
public class ServiceB {
@Transactional(propagation = Propagation.XXX) // 传播行为决定B的事务规则
public void methodB() {
// 业务操作
}
}
2. 7 种传播行为(按常用程度排序)
| 传播行为 | 名称 | 核心规则 | 适用场景 |
|---|---|---|---|
| 必需(默认) | REQUIRED | 如果当前有事务,就加入;没有就新建 | 绝大多数业务场景(如订单创建 + 扣库存) |
| 新建 | REQUIRES_NEW | 无论当前是否有事务,都新建独立事务;原事务挂起,新事务执行完后恢复原事务 | 日志记录、消息发送(即使主事务回滚,日志仍需提交) |
| 嵌套 | NESTED | 如果当前有事务,就嵌套在其中(子事务);没有就新建;子事务回滚不影响主事务,主事务回滚子事务必回滚 | 分步骤提交(如批量插入,某一步失败仅回滚该步) |
| 支持 | SUPPORTS | 如果当前有事务,就加入;没有就以非事务方式执行 | 查询类方法(可选事务) |
| 不支持 | NOT_SUPPORTED | 以非事务方式执行;如果当前有事务,就挂起 | 耗时的非核心操作(如导出报表) |
| 强制 | MANDATORY | 必须在已有事务中执行,否则抛异常 | 核心业务方法(必须依赖外层事务) |
| 禁止 | NEVER | 必须以非事务方式执行,否则抛异常 | 绝对不允许有事务的方法(如纯内存操作) |
3. 传播机制的执行逻辑(可视化)


浙公网安备 33010602011771号