Java 使用捕获的RuntimeException回滚

Java 使用捕获的RuntimeException回滚,java,hibernate,rollback,transactional,runtimeexception,Java,Hibernate,Rollback,Transactional,Runtimeexception,我显然需要一些关于事务回滚的帮助。我正在开发一个Spring/JPA/Hibernate应用程序 对我来说,RuntimeException即使捕获到它们,也会回滚事务。我通过一些测试(不幸的是,我不能把它们放在这里,因为我已经没有了)和阅读来推断这一点 但我在以下代码中遇到了另一种行为: public class Service implements IService { @Transactional public void test() { // ... try

我显然需要一些关于事务回滚的帮助。我正在开发一个Spring/JPA/Hibernate应用程序

对我来说,
RuntimeException
即使捕获到它们,也会回滚事务。我通过一些测试(不幸的是,我不能把它们放在这里,因为我已经没有了)和阅读来推断这一点

但我在以下代码中遇到了另一种行为:

public class Service implements IService {

  @Transactional
  public void test()
  {
    // ...
    try {
      throw new RuntimeException();
    } catch (RuntimeException re) {
    }
    foo.setBar(barValue);
    this.fooDao.save(foo);
  }
}
从控制器执行此操作后,
bar
参数上的更改出现在我的数据库中,这意味着事务尚未回滚

现在是问题


捕获的runtimeException是否会导致回滚?还是我错了?

如果捕获未检查的异常,例如
runtimeException
,则事务将不会回滚


默认情况下,如果您的方法由于未检查的异常而退出,则事务将回滚。默认情况下,选中的异常不会触发回滚。

也许我不明白这里发生了什么,但是您不需要将回滚代码放在catch块内部吗?FWIW您正在try catch外部调用
fooDao.save(foo)
,因此如果这导致了
运行时异常
,然后,它当然会回滚,因为它没有被捕获。谢谢,你知道为什么在某些情况下,即使捕获了runtimeexception,它也会导致回滚吗?