Hibernate 的 Session.close() 是否会自动回滚未提交的事务?

2022-09-03 14:59:02

我目前正在阅读Hibernate文档,我遇到了以下引用:

如果会话引发异常(包括任何 SQLException),请立即回滚数据库事务,调用 Session.close() 并丢弃会话实例。会话的某些方法不会使会话处于一致状态。Hibernate 引发的任何异常都不能被视为可恢复。确保会话将通过在 finally 块中调用 close() 来关闭。

就我而言,这一切都是有道理的,但它确实让我想知道,在既不提交也不回滚事务的情况下,关闭会话会产生什么影响?

例如,考虑以下事项:

  session = getSessionFactory().openSession();
  session.beginTransaction();
  session.save(carObject);
  //session.getTransaction().commit();
  session.close();

如果 commit 被注释掉,并且没有调用此处的回滚,session.close() 的预期行为是什么?它是否只是自动回滚提交,它是否留下“挂起”事务?等。

(我知道这显然不是一个好的做法 - 我只是想更多地了解基本概念。


答案 1

我对Hibernate做了一些挖掘:

持久性会话使其生命周期在某种程度上独立于 JDBC 连接。当您关闭休眠时,连接将被释放“释放连接”的确切含义取决于连接最初是如何获得的Session

  • 如果连接是手动提供的(例如通过 ),则在调用 session.close() 时,您将获得可能与未完成事务的连接sessionFactory.openStatelessSession(connection)
  • 在其他情况下,呼叫通常以呼叫结束session.close()connection.close()

Hibernate 不会进行自动会话刷新或事务提交/回滚。JPA 的 EntityManager 也是如此。

因此,最终会发生什么取决于您的连接提供程序/数据源。使用 C3PO,当连接返回到池时,任何未完成的事务都将回滚。另一方面,如果您已经管理了 JTA 连接,那么实际的事务处理可能完全超出了应用程序的范围。


答案 2

推荐