【问题标题】:Does Hibernate's Session.close() automatically rollback uncommitted transactions?Hibernate 的 Session.close() 会自动回滚未提交的事务吗?
【发布时间】:2013-10-16 06:26:45
【问题描述】:

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

(我知道这显然不是一个好习惯 - 我只是想进一步了解基本概念。)

【问题讨论】:

标签: java hibernate session transactions


【解决方案1】:

我对 Hibernate 做了一些研究:

持久性会话使其生命周期在某种程度上独立于 JDBC 连接。当您关闭 Hibernate 的Session 时,连接释放“释放连接”的确切含义首先取决于connection was obtained的方式:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多