草稿

zy123
2025-03-21 /  0 评论 /  0 点赞 /  2 阅读 /  688 字
最近更新于 07-05

下面把 传播行为 拆成“有父事务时怎么做”和“无父事务时怎么做”两个维度,比原来的「是否必须有父事务 / 是否会新建事务」更直观——一眼就能看出它在两种场景下的动作差异。

传播行为 父事务已存在时 父事务不存在时 典型用途 / 说明
REQUIRED (默认) 加入父事务→ 共提交 / 回滚 创建新事务 日常业务写操作,保持一致性
REQUIRES_NEW 挂起父事务自己新建事务 自己新建事务 写日志、发送 MQ 等:外层失败也要单独成功
SUPPORTS 加入父事务 非事务方式执行 只读查询:有事务跟随一致性,没有就轻量查询
NOT_SUPPORTED 挂起父事务→ 非事务方式执行 非事务方式执行 大批量/耗时操作,避免长事务锁表
MANDATORY 加入父事务 立即抛异常 防御性编程:强制要求调用方已开启事务
NEVER 立即抛异常 非事务方式执行 禁止在事务里跑的代码(如特殊 DDL)
NESTED 同一物理事务,打 SAVEPOINT→ 子回滚只回到保存点 创建新事务(与 REQUIRED 效果相同) 分段回滚;需 DB / JDBC 支持保存点

使用 Tips

  • 不想被外层事务拖垮REQUIRES_NEW
  • 可有可无事务的读操作SUPPORTS
  • 耗时任务要彻底裸跑NOT_SUPPORTED
  • 局部失败但整体继续NESTED(保存点)
  • 强约束外层必须有事务MANDATORY
  • 坚决拒绝在事务里执行NEVER

这样,你只需关心:

「现在有没有父事务?✚ → 该传播行为会怎么做?」

就能快速判断是否满足你的业务需求。

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
取消