Spring服务间事务传播疑问:REQUIRED属性下事务数量问题
事务传播属性
REQUIRED的实际调用逻辑解答 嘿,这个问题问到点子上了!咱们直接给结论:只会创建1个事务——由服务1的方法A开启,服务2的方法B会直接共用这个事务。
为啥是这样?得从REQUIRED这个传播属性的核心规则说起:
REQUIRED是Spring事务的默认配置,它的逻辑非常直白:如果当前上下文已经存在活跃事务,就直接加入这个事务;如果没有,就新建一个事务。- 当客户端调用服务1的方法A时,此时没有任何活跃事务,Spring会为方法A创建一个全新的事务。
- 紧接着方法A调用服务2的方法B时,因为当前已经有一个由方法A开启的活跃事务在运行,方法B的
REQUIRED属性会触发“加入已有事务”的逻辑,不会再新建事务。
顺便给你提个项目中复合操作的注意点:
- 这种情况下,方法A和方法B的所有数据库操作都在同一个事务边界内,遵循“要么全成,要么全败”的原则。比如如果方法B执行失败抛出了未被捕获的异常,整个事务(包括方法A已经完成的操作)都会被回滚。
- 如果你的业务场景需要方法B在独立事务中执行(比如方法B失败不影响方法A的提交),那可以把方法B的事务传播属性改成
REQUIRES_NEW——这个属性会强制新建一个独立事务,和方法A的事务完全隔离,彼此的提交/回滚互不影响。
内容的提问来源于stack exchange,提问作者whysoseriousson
相关产品推荐
相关产品推荐

