gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:07 25 4
gpt4 key购买 nike

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

If the Session throws an exception, including any SQLException, immediately rollback the database transaction, call Session.close() and discard the Session instance. Certain methods of Session will not leave the session in a consistent state. No exception thrown by Hibernate can be treated as recoverable. Ensure that the Session will be closed by calling close() in a finally block.

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

例如考虑以下内容:

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

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

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

最佳答案

我已经深入研究了 Hibernate:

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

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

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

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

关于java - Hibernate 的 Session.close() 是否自动回滚未提交的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com