当前位置: 首页 > 面试题库 >

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

拓拔富
2023-03-14
问题内容

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

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

就我而言,这一切都说得通,但这确实让我想知道,关闭会话并带来既未提交又未回退的事务会有什么影响?

例如,考虑以下几点:

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

注释掉提交后,此处未调用任何回滚,session.close()的预期行为是什么?它是否只是简单地自动回滚提交,是否留下了“挂起”事务?等等

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


问题答案:

我已经对Hibernate做了一些研究:

持久性会话使它们的生命周期在某种程度上与JDBC连接无关。当您关闭Hibernate时Session,连接被 释放“释放连接”的
确切含义取决于首先获得连接的方式:

  • 如果连接是手动提供的(例如通过sessionFactory.openStatelessSession(connection)),则在致电时您可能会返回未完成的交易的连接session.close()
  • 在其他情况下,通话session.close()通常会以通话结束connection.close()

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

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



 类似资料:
  • 我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。

  • 我在这里很困惑。JPA中的提交或回滚完成事务吗?我使用的是spring和容器管理的EntityManager。感谢任何回答。

  • 我是WebServices的新手。Im通过标记为“Transacted”的camel路由向cxfendpoint发送webservice请求,并得到响应。在同一事务路由中,next语句抛出一个异常,以便我的异常处理程序回滚该事务。 我可以在我的事务回滚中找到其他东西,除了我的webservice请求响应,因为它已经提交了。

  • 这是我的第一篇文章,所以我真的必须挠头,因为这里的资源非常好。 SpringMVC 4.2.5。hibernate-core-5.1.0 JDK8 我遇到了一个问题,当离开一个被调用的@Transactional方法时,事务没有回滚。我调用的方法具有适当的设置: 该方法调用dao对象,假设我们保存了大约8个对象(“到数据库”),例如: 对于典型的刀来说,它只是做一些类似的事情: 首先,我从普通PO

  • 以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 - 编译并运行结果如下 -

  • 下面的代码是否可以正常工作,或者我需要在工作之前开始交易。