propagation_required 是 spring 默认事务传播行为,有事务则加入,无事务则新建;它保障多方法协同回滚,实现强一致性,但需避免异常捕获、非代理调用及非 public 方法等误区。

PROPAGATION_REQUIRED 是 Spring 事务最常用、也是默认的传播行为。它的核心就一句话:**有事务就加入,没事务就新建**。
它怎么决定是否用当前事务?
Spring 在执行一个加了 @Transactional(propagation = Propagation.REQUIRED) 的方法前,会先检查当前线程是否存在活跃事务(即调用链上游是否已开启事务):
- 如果存在——该方法直接加入这个已有事务,共享同一个事务上下文;所有数据库操作都在这一个事务里,提交或回滚是“全有或全无”
- 如果不存在——Spring 自动为你开启一个新事务,方法执行完后按规则提交或回滚
为什么说它是“事务一致性”的基础?
它让多个业务方法天然具备协同回滚能力,适合强一致性场景:
- 比如“创建订单 + 扣减库存”,两个操作分别在不同 Service 方法中,但都用 REQUIRED —— 它们实际运行在同一个事务中
- 只要其中任意一步抛出未捕获的运行时异常(且满足 rollback-for 配置),整个事务回滚,订单不会残留,库存也不会误扣
- 即使外层 Controller 没加 @Transactional,只要第一个 Service 方法用了 REQUIRED,后续被它调用的其他 REQUIRED 方法都会自动纳入该事务
常见误区提醒
这个行为不等于“一定新建事务”,也不代表“绝对安全”:
- 方法内部 try-catch 吞掉异常 → 事务不会感知失败 → 不会回滚(需手动
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()) - 跨 Service 调用必须是 Spring 代理生效的调用(即通过注入对象调用,不能 this.bMethod())
- 非 public 方法上加 @Transactional 无效(Spring AOP 代理限制)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











