为什么我们必须在出现错误时回滚hibernate事务?

nom7f22z  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(110)

根据这个答案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();
    }

字符串

jljoyd4f

jljoyd4f1#

如果你不回滚或提交事务,Hibernate将保持连接,直到事务超时,所以每个请求将从连接池中获取一个新的连接,它(连接池)可以达到它的最大大小。因此,当您完成工作或遇到异常时,应该回滚或提交事务。

相关问题