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

推荐答案

如果不回滚或提交事务,Hibernate将保留连接,直到事务超时,因此每个请求将从连接池获取一个新连接,并且它(连接池)可以达到其最大大小.因此,您应该在完成工作或遇到异常时回滚或提交事务.

Java相关问答推荐

我的scala文件失败了Scala.g4 ANTLR语法

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

如何在Java中声明未使用的变量?

XPages-在第二次点击按钮之前延迟

如何找到MongoDB文档并进行本地化?

内存中的H2修剪尾随空格

与Spring Boot相关的实体未正确保存

如何使用Jackson将XML元素与值和属性一起封装

尽管通过中断请求线程死亡,但线程仍将继续存在

带有Health Check的Spring Boot BuildPack打破了本机映像构建过程

如何在JavaFX中制作鼠标透明stage

允许同时执行两个方法,但不能同时执行这两个方法

如何获得凌空cookies ,并设置它在下一个请求- android

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

对角线填充二维数组

如何使用jooq更新记录?

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

在Spring Boot中使用咖啡因进行缓存

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为