我目前正在阅读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,连接被 释放 。 “释放连接”的 确切含义取决于首先获得连接的方式:
Session
sessionFactory.openStatelessSession(connection)
session.close()
connection.close()
Hibernate不会自动进行会话刷新或事务提交/回滚。JPA的状态相同EntityManager。
EntityManager
因此,最终会发生什么情况取决于您的连接提供者/数据源。使用C3PO,将连接返回到池时,任何未完成的事务都会回滚。另一方面,如果您已经管理了JTA连接,则实际的事务处理可能完全超出了应用程序的范围。