15

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

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

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

例如,考虑以下内容:

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

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

(我明白这显然不是一个好习惯——我只是想更多地了解基本概念。)

4

1 回答 1

14

我对 Hibernate 做了一些研究:

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

  • 如果连接是手动提供的(例如通过sessionFactory.openStatelessSession(connection)),您将在调用时获得与可能未完成的交易的连接session.close()
  • 在其他情况下,调用session.close()通常最终会调用connection.close()

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

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

于 2013-10-16T09:38:47.500 回答