propagation:传播行为

事务传播行为(Propagation)定义了多个事务方法相互调用时,事务的创建、嵌套、隔离规则,核心解决 “方法调用时事务如何联动” 的问题。以下是 7 种传播行为及其特性的总结:

1. REQUIRED(默认值)

  • 特性:如果当前有事务,就加入该事务;如果没有,就新建一个事务。
  • 核心:“随大流”,所有操作合并到同一事务中,要么一起成功,要么一起回滚。
  • 场景:大多数业务场景(如订单创建时同时扣库存、减余额)。

2. SUPPORTS

  • 特性:如果当前有事务,就加入;如果没有,就以非事务方式执行(不开启事务)。
  • 核心:“可选事务”,有无事务均可,不主动创建事务。
  • 场景:查询操作(如订单详情查询,有事务则参与,无则直接执行)。

3. MANDATORY

  • 特性:必须在已存在的事务中执行;如果当前没有事务,直接抛异常。
  • 核心:“强制依赖”,自己不创建事务,必须依赖上层调用者的事务。
  • 场景:核心操作(如资金扣减,必须在调用者的事务中执行,防止无事务时数据错乱)。

4. REQUIRES_NEW

  • 特性:无论当前是否有事务,都新建一个独立事务;若当前有事务,则先暂停原事务,新事务执行完再恢复。
  • 核心:“独立分家”,新事务与原事务完全隔离,各自独立提交 / 回滚。
  • 场景:日志记录(主事务失败,日志仍需保存,避免丢失操作记录)。

5. NOT_SUPPORTED

  • 特性:以非事务方式执行;若当前有事务,则暂停原事务,执行完后恢复。
  • 核心:“拒绝事务”,不参与任何事务,强制非事务执行。
  • 场景:耗时操作(如批量数据导出,避免事务长时间占用资源)。

6. NEVER

  • 特性:必须以非事务方式执行;若当前有事务,直接抛异常。
  • 核心:“严格禁止事务”,比 NOT_SUPPORTED 更严格,不允许在事务中执行。
  • 场景:特殊操作(如某些不允许事务控制的脚本执行)。

7. NESTED

  • 特性:如果当前有事务,就在嵌套事务中执行(依赖外层事务,有独立保存点);如果没有,就新建事务(同 REQUIRED)。
  • 核心:“嵌套子事务”,外层事务回滚时,嵌套事务也回滚;但嵌套事务回滚时,外层事务可继续执行(通过保存点控制部分回滚)。
  • 场景:复杂业务中的分步操作(如订单提交时,优惠券扣减失败可单独回滚,不影响订单其他步骤)。

关键特性对比

传播行为 是否创建新事务 与原事务的关系 回滚影响范围
REQUIRED 按需创建 融入原事务,共享一个事务 一起回滚
REQUIRES_NEW 强制创建 独立事务,原事务被暂停 各自独立回滚
NESTED 嵌套在原事务中 依赖原事务,有独立保存点 外层回滚影响内层,内层回滚不影响外层

理解传播行为的核心是:明确 “新方法是否需要事务”“与调用者事务的关系”“回滚时如何联动”,从而根据业务场景选择合适的规则,避免事务失效或数据不一致。