【问题标题】:Rollback with catched RuntimeException使用捕获的 RuntimeException 回滚
【发布时间】:2013-04-22 16:00:24
【问题描述】:

我显然需要一些关于事务回滚的帮助。我正在开发一个 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);
  }
}

从控制器执行此操作后,barparameter 的更改存在于我的数据库中,这意味着事务尚未回滚。

现在的问题

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

【问题讨论】:

  • 也许我只是不明白这里发生了什么,但是您不需要将回滚代码放在 catch 块中吗?
  • FWIW 你在 try-catch 之外调用 fooDao.save(foo),所以如果这是导致 RuntimeException 的原因,那么它当然会回滚,因为它没有被捕获。

标签: java hibernate rollback transactional runtimeexception


【解决方案1】:

如果您捕获到未经检查的异常,例如RuntimeException,事务不会回滚。

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

【讨论】:

  • 谢谢,您知道为什么在某些情况下即使捕获到运行时异常也会导致回滚?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多