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

时间:2013-10-16 06:26:46

标签: java hibernate session transactions

我正在阅读目前的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()的预期行为是什么?它是否只是自动回滚该提交,是否会留下“挂起”事务?等

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

1 个答案:

答案 0 :(得分:10)

我已经对Hibernate进行了一些挖掘:

持久性会话使其生命周期与JDBC连接有些独立。当您关闭Hibernate的Session时,连接已发布“释放连接”的确切含义取决于connection was obtained的首位:

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

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

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