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 核心逻辑:无论调用方有无事务,都新建独立事务,原事务会被挂起,新事务执行完后恢复原事务。 适用于“即使主事务失败,子操作也必须提交”的场景(如记录操作日志)。
阅读全文