微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring / Hibernate @Transactional 不会刷新事务,如果之后是第二次 @Transactional 调用

如何解决Spring / Hibernate @Transactional 不会刷新事务,如果之后是第二次 @Transactional 调用

我的 Spring Boot 应用程序中有一个奇怪的行为。

应用将 OpenSessionInView 设为 false

我有一个控制器和一个服务,公开了两个带有注释的方法@Transactionnal

应用程序属性

spring.jpa.open-in-view=false

我的服务:

@Service
public class MyService {
        @Transactional(transactionManager = "myTx")
        public void doA(Integer objectId) {
                Object o = repo.findMyObject(objectId);
                updateMyObject(o);
                repo.save(o);
        }

        @Transactional(transactionManager = "myTx")
        public void dob(Integer objectId) {
                Object o = repo.findMyObject(objectId);
                updateMyObjectDifferently(o);
                repo.save(o);
        }
}

我的控制器(案例 1):

@RequestMapping("/do/{myId}")
    public String do(Model model,HttpServletRequest request) {

        service.doA(myId);
        service.dob(myId);

        return "page";
    }

使用调试中的 sql,我看到 SELECT 查询是在调用服务期间执行的。 但是我看到只有 1 个刷新(几个更新),并且在 service.dob() 完成并且方法周围的 TransactionInterceptor 启动方法 invokeWithinTransaction 时完成,这很奇怪。

由于这两种方法都有@Transactional,我希望看到 2 次刷新:第一次刷新是在 service.doA() 结束时,第二次刷新是在 service.dob() 结束时).

更奇怪的是,如果我评论第二个电话,那么

我的控制器(案例 2):

@RequestMapping("/do/{myId}")
    public String do(Model model,HttpServletRequest request) {

        service.doA(myId);
        //service.dob(myId);

        return "page";
    }

在第一种情况下,就像 service.doA() 知道第二个调用将在同一对象之后到达,因此它不会提交/刷新事务并等待 service.dob() 结束。

为什么我只看到 1 个同花顺? 是不是因为两个调用都在某个 DB 对象上?

我认为我对@Transactional 的了解还可以。 但现在,我迷路了。

解决方法

Hibernate 会检测一个对象是否真的是脏的,如果没有必要,它会避免发送 UPDATE 语句。我假设您的 updateMyObject 并没有改变实体相对于它最初加载时的状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?