事务传播机制
PROPAGATION_REQUIRED
这是注解默认的值:
- 如果当前没有物理事务,Spring 会创建一个事务
- 如果已有物理事务,则加入这个事务
- 所有逻辑事务都映射到同一个物理事务
PROPAGATION_REQUIRES_NEW
无论当前是否存在事务,Spring 总 会创建新的独立物理事务:
- 内部事务启动全新数据库连接
- 如果外部事务存在,会先将其挂起
- 内部事务的提交或回滚不影响外部事务
- 典型应用:日志记录、审计等非核心业务
PROPAGATION_NESTED
与 PROPAGATION_REQUIRED 类似,但具有更精细的回滚控制:
- 创建嵌套事务,设置 SAVEPOINT(保存点)
- 嵌套事务回滚不影响外部事务,只回滚到保存点
- 典型应用:批量处理单条记录失败不影响整批
PROPAGATION_MANDATORY
当前方法必须在已存在的物理事务中运行:
- 如果没有活动事务,抛出 IllegalTransactionStateException 异常
- 典型应用:资金转账、库存扣减等核心业务
PROPAGATION_NEVER
方法必须在非事务环境下执行:
- 如果存在事务上下文,抛出 IllegalTransactionStateException 异常
- 典型应用:不需要事务的读取操作
PROPAGATION_SUPPORTS
方法可在事务中运行也可不在事务中运行:
- 存在物理事务时,加入现有事务
- 不存在物理事务时,以非事务方式执行
- 典型应用:查询操作
PROPAGATION_NOT_SUPPORTED
当前方法不应在事务上下文中运行:
- 如果存在活动事务,将其挂起
- 方法执行完毕后恢复被挂起的事务
- 典型应用:日志记录、发送通知等非核心业务