如何在春季回滚整个循环的交易?



所以我有一个循环,其中发生了多个事务,如果一个项目无效,我希望程序回滚所有以前的事务。 我正在使用 spring 启动来实现我所有的依赖注入和 jpa 功能

此代码段是服务中的服务方法

@Override
@Transactional(rollbackOn = ItemInvalidException.class)
public void saveAll (List<Item> items) throws ItemInvalidException{
for(Item item :Items){
if(item==invalid)
throw new ItemInvalidException();
itemRepository.save(item)
}
}

事务的理想行为正是您提到的。事务将仅在方法末尾提交,而不是在每个记录上提交。在迭代的任何时候,如果我们得到异常,整个事务将被回滚而不保存任何数据。

如果您觉得这种行为没有发生,那么我想您正在同一个 bean 中调用@Transactional方法。@Transactional仅适用于在 spring 创建的代理上调用的方法。这意味着,当您创建@Service或其他 Bean 时,从外部调用的方法将是事务性的。如果从 bean 内部调用,则不会发生任何事情,因为它不会通过代理对象。

我不确定你的问题到底是什么,如果你觉得交易从未发生过,那么上面的事情可能是一个原因。希望这对您有所帮助

最新更新