spring事务传播行为共7种,核心是解决方法嵌套调用时事务上下文的复用与隔离问题:required共享同一事务;requires_new开启独立事务;nested支持保存点局部回滚;supports、mandatory、not_supported、never按场景选择。

Spring事务传播行为共7种,本质是解决“方法A调用方法B时,B该不该、能不能、要不要用A的事务”这个问题。选对的关键不在于背名称,而在于看业务逻辑是否需要事务隔离、是否允许失败影响主流程、是否必须依赖外部事务上下文。
REQUIRED:大多数业务的默认选择
当前有事务就加入,没有就新建。整个调用链共享同一个事务,一荣俱荣、一损俱损。
- 下单时创建订单 + 扣减库存 + 更新用户余额,必须全部成功或全部回滚
- Service层内部多个方法相互调用,且都参与同一业务原子性
- 注意:内层方法抛异常,即使外层try-catch了,整个事务仍会回滚
REQUIRES_NEW:需要独立提交的场景
不管外层有没有事务,都强制开启新事务,并把原事务挂起。新事务提交/回滚不影响外层事务状态。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 操作日志、审计记录、消息发送——失败不能拖垮主业务
- 支付回调中触发通知,要确保通知动作立即落库,不卡在主事务里
- 性能有损耗(约15%~20%),慎用于高频调用
NESTED:想局部回滚又不想拆事务
外层有事务时,设一个保存点(Savepoint),内层可单独回滚到该点;外层回滚则连带所有嵌套操作一起回滚。
- 批量导入数据,某条出错只跳过该条,其余继续执行
- 订单创建中校验地址、优惠券、库存,某一项失败仅回滚该项操作
- 依赖数据库支持保存点(如MySQL InnoDB),H2、Oracle也支持;SQL Server需开启特定配置
其他三种按需启用,用得少但关键时不可替代
SUPPORTS:纯查询方法,有事务就跟着走,没事务也不强求——适合详情页、统计类接口。
MANDATORY:必须运行在已有事务中,否则直接报错——适合“子流程”类方法,比如updateOrderStatus(),设计上就不该被单独调用。
NOT_SUPPORTED:明确拒绝事务,哪怕外层有也要挂起——适合写本地缓存、发MQ、打监控埋点等非DB操作。
NEVER:极少见,要求绝对不能在事务里执行,否则抛异常——基本只用于测试或特殊风控校验。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










