Spring @Transactional与save()方法事务一致性问题求助
正确的Spring事务实现方案
核心原理说明
- Spring Data JPA的
save()方法默认不会开启独立事务,它会自动复用当前上下文已存在的事务。 - Spring的
@Transactional基于代理实现,同一类内部方法调用时,子方法的@Transactional注解不会生效,所以无需在子方法重复添加。
修正后的代码实现
// 仅在根方法添加@Transactional,开启全局事务 @Transactional public void root_method() { method_A(); } // 子方法无需添加@Transactional,自动复用根方法的事务 public void method_A() { Header header = new Header(); headerRepository.save(header); for (Item item : getJustAllocatedItems()) { item.setHeader(header); method_B(item); } } // 子方法同样无需添加@Transactional public void method_B(Item item) { itemRepository.save(item); }
关键注意事项
- 确保
root_method是通过Spring代理调用(比如从另一个Bean调用,而非同一类内部调用),否则@Transactional也不会生效。 - 如果子方法需要被外部单独调用,可给子方法添加
@Transactional(propagation = Propagation.REQUIRED)(默认就是REQUIRED),这样外部调用时会开启事务,内部调用时复用根事务。 - 若任意一步操作抛出RuntimeException(Spring默认回滚异常类型),整个事务会自动回滚,实现Header和Item的全提交/全回滚。
内容的提问来源于stack exchange,提问作者Jano
相关产品推荐
相关产品推荐

