Spring事务传播机制是怎样的一个?
摘要:Spring 事务传播机制是 Spring 事务中最核心也最易混淆的概念,它定义了一个带有事务的方法被另一个方法调用时,事务如何传递和生效(比如是否新建事务、是否加入已有事务、是否挂起事务等)。 核心前提:传播机制仅适用于Spring 管理
Spring 事务传播机制是 Spring 事务中最核心也最易混淆的概念,它定义了一个带有事务的方法被另一个方法调用时,事务如何传递和生效(比如是否新建事务、是否加入已有事务、是否挂起事务等)。
核心前提:传播机制仅适用于Spring 管理的 Bean 之间的方法调用(即通过代理对象调用),内部调用仍会导致事务失效(前文提到过)。
一、先理解核心概念
事务传播机制解决的核心问题:当方法 A(有事务)调用方法 B(有/无事务)时,B 的事务如何与 A 的事务交互?
当前事务:调用方方法已存在的事务上下文;
新事务:被调用方方法重新创建的独立事务;
无事务:被调用方方法不使用任何事务。
二、Spring 事务传播机制(7种核心类型)
Spring 在 TransactionDefinition 接口中定义了 7 种传播行为,按使用频率和场景分为三大类:
传播行为常量
中文名称
核心规则(关键!)
典型使用场景
REQUIRED(默认)
必须有事务
有则加入,无则新建
绝大多数业务场景(增删改)
SUPPORTS
支持事务
有则加入,无则无事务
查询类方法(可选事务)
MANDATORY
强制事务
有则加入,无则抛异常
必须在事务中执行的核心操作
REQUIRES_NEW
新建事务
无论有无,都新建事务,挂起当前事务
日志记录、异步通知(独立事务)
NOT_SUPPORTED
不支持事务
无论有无,都无事务,挂起当前事务
纯内存操作(无需事务)
NEVER
禁止事务
有事务则抛异常,无则无事务
绝对不允许在事务中执行的操作
NESTED
嵌套事务
有则嵌套(保存点),无则新建
主事务回滚不影响子事务(极少)
逐类详解(附代码示例)
1. 最常用:REQUIRED(默认)
核心逻辑:调用方有事务则加入,无则新建。
这是 Spring 事务的默认传播行为,也是日常开发中 90% 场景的选择。
@Service
public class OrderService {
@Autowired
private StockService stockService;
// 调用方:有事务
@Transactional(propagation = Propagation.REQUIRED)
public void createOrder() {
// 1. 保存订单(当前事务)
saveOrder();
// 2. 调用库存服务(加入当前事务)
stockService.reduceStock();
// 3. 任意一步失败,整个事务回滚
}
}
@Service
public class StockService {
// 被调用方:REQUIRED(默认)
@Transactional
public void reduceStock() {
updateStock(); // 与创建订单在同一个事务中
}
}
效果:
如果 createOrder 先执行(有事务),reduceStock 会加入该事务,两者同成功/同失败;
如果直接调用 reduceStock(无事务),则新建事务执行。
2. 独立事务:REQUIRES_NEW
核心逻辑:无论调用方有无事务,都新建独立事务,原事务会被挂起,新事务执行完后恢复原事务。
适用于“即使主事务失败,子操作也必须提交”的场景(如记录操作日志)。
