事务传播机制

PROPAGATION_REQUIRED

这是注解默认的值:

  • 如果当前没有物理事务,Spring 会创建一个事务
  • 如果已有物理事务,则加入这个事务
  • 所有逻辑事务都映射到同一个物理事务

PROPAGATION_REQUIRES_NEW

无论当前是否存在事务,Spring 总 会创建新的独立物理事务:

  • 内部事务启动全新数据库连接
  • 如果外部事务存在,会先将其挂起
  • 内部事务的提交或回滚不影响外部事务
  • 典型应用:日志记录、审计等非核心业务

PROPAGATION_NESTED

与 PROPAGATION_REQUIRED 类似,但具有更精细的回滚控制:

  • 创建嵌套事务,设置 SAVEPOINT(保存点)
  • 嵌套事务回滚不影响外部事务,只回滚到保存点
  • 典型应用:批量处理单条记录失败不影响整批

PROPAGATION_MANDATORY

当前方法必须在已存在的物理事务中运行:

  • 如果没有活动事务,抛出 IllegalTransactionStateException 异常
  • 典型应用:资金转账、库存扣减等核心业务

PROPAGATION_NEVER

方法必须在非事务环境下执行:

  • 如果存在事务上下文,抛出 IllegalTransactionStateException 异常
  • 典型应用:不需要事务的读取操作

PROPAGATION_SUPPORTS

方法可在事务中运行也可不在事务中运行:

  • 存在物理事务时,加入现有事务
  • 不存在物理事务时,以非事务方式执行
  • 典型应用:查询操作

PROPAGATION_NOT_SUPPORTED

当前方法不应在事务上下文中运行:

  • 如果存在活动事务,将其挂起
  • 方法执行完毕后恢复被挂起的事务
  • 典型应用:日志记录、发送通知等非核心业务