根据这个答案https://stackoverflow.com/a/3588173/22172432,如果我们不提交或回滚事务,它将超时并回滚。那么,如果事务无论如何都要回滚,为什么要回滚catch块中的事务呢?我在一个教程中读到过“在hibernate中,如果发生任何异常,最好回滚事务,这样资源就可以释放了”,但是“资源”是什么意思呢?hibernate是否保持数据库中的物理事务处于打开状态?AFAIK不,因为hibernate有一个本地缓存(持久化上下文),首先它会将任何更改写入其上下文,它只是一个与持久化上下文相关的事务的逻辑概念。
示例代码:
SessionFactory factory = new Configuration()
.configure("persistence.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
var transaction = session.beginTransaction();
try {
Employee person1 = session.get(Employee.class, 1L);
person1.setSalary(100000d);
if (true) {
throw new RuntimeException("error!");
}
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
if (transaction.isActive())
transaction.rollback();
}
字符串
1条答案
按热度按时间jljoyd4f1#
如果你不回滚或提交事务,Hibernate将保持连接,直到事务超时,所以每个请求将从连接池中获取一个新的连接,它(连接池)可以达到它的最大大小。因此,当您完成工作或遇到异常时,应该回滚或提交事务。