如果你不在Hibernate中回滚事务会怎么样?

Joh*_*ams 7 java orm hibernate transactions rollback

我读到的关于Hibernate的所有内容都表明你必须回滚事务并在发生错误时关闭会话,并且通常会给出以下代码的一些变体(取自Hibernate的文档)作为示例:

Session sess = factory.openSession();
Transaction tx = null;
try {
    tx = sess.beginTransaction();
    // do some work
    ...
    tx.commit();
} catch (RuntimeException e) {
    if (tx != null) tx.rollback();
    throw e; // or display error message
} finally {
    sess.close();
}
Run Code Online (Sandbox Code Playgroud)

出于几个原因,这种模式对我来说似乎很奇怪.首先,对于一个通常用于简化事物的框架来说,这似乎是不合理的复杂.更重要的是,如果try块中的代码抛出除了RuntimeException?之外的其他内容会发生什么?在这种情况下,Hibernate看起来好像必须能够用开放事务优雅地关闭会话,大概是通过回滚它,但如果这是真的,为什么还要打电话rollback呢?

Ron*_*erg 5

Hibernate 可能使很多事情变得更简单,但是事务管理并不是很简单,因此对于每个事务,您必须非常仔细地考虑您想要什么。Hibernate 无法帮助您解决这个问题。

如果try块中的代码抛出 a 以外的任何内容RuntimeException,则您的事务显然不会提交。但是您也没有明确回滚。sess.Closefinally的调用也不会回滚事务。会发生什么取决于这是否是嵌套事务:

  • 如果不是,那么最终事务会超时并回滚。
  • 如果是,父事务在提交自己的时候会看到子事务还没有提交。这将导致整个事务的回滚。