所以我有一个循环,其中发生了多个事务,如果一个项目无效,我希望程序回滚所有以前的事务。 我正在使用 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 内部调用,则不会发生任何事情,因为它不会通过代理对象。
我不确定你的问题到底是什么,如果你觉得交易从未发生过,那么上面的事情可能是一个原因。希望这对您有所帮助