Spring Boot 3.2.4 @Transactional私有方法事务行为疑问
Spring Boot 3.2.4中私有方法共享外部事务的原因解析
Spring事务的核心逻辑:代理+线程绑定
Spring的@Transactional靠动态代理实现——只有通过代理对象调用的方法才会触发事务的开启/关闭逻辑。但你这里是同一个类内部,从带@Transactional的methodA调用私有方法methodB时,methodB的执行并没有跳出当前线程,而当前线程已经绑定了methodA开启的事务上下文。Repository方法的默认事务传播行为
Spring Data JPA的Repository(不管是PagingAndSortingRepository还是JpaRepository)里的save方法,默认自带@Transactional(propagation = Propagation.REQUIRED)注解。这个传播行为的意思是:如果当前已经存在事务,就直接加入这个事务;如果没有才新建。所以methodB里调用save时,会直接复用methodA开启的事务,而非自己开新事务。为什么一起回滚?
两个save操作都在同一个事务里执行,当methodB抛出RuntimeException(Spring事务默认触发回滚的异常类型),整个事务会被标记为回滚状态,最终两个插入操作都会被撤销。
你之前的误解在于:私有方法确实不会被Spring的事务切面单独增强(也就是不会自己启动事务),但它会共享当前线程中已经存在的事务上下文,所以里面的数据库操作会被外部事务统一管理。
内容的提问来源于stack exchange,提问作者Michel DIO
相关产品推荐
相关产品推荐

