有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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查询是在调用服务期间执行的。 但我只看到了一次刷新(几次更新),而且在服务完成时就完成了。doB()完成后,方法周围的TransactionInterceptor会启动方法invokeWithinTransaction,这很奇怪

由于两种方法都有@Transactional,我希望看到两次刷新:第一次刷新就在服务结束时。doA()和服务结束时的第二次刷新。doB()

更奇怪的是,如果我评论第二次通话

我的控制器(案例2):

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

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

        return "page";
    }

在案例1中,这就像服务。doA()知道第二个调用将在同一个对象上紧接着到达,因此它不会提交/刷新事务并等待服务结束。doB()

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

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


共 (1) 个答案

  1. # 1 楼答案

    Hibernate将检测对象是否真的脏了,如果没有必要,则避免发送UPDATE语句。我假设你的updateMyObject只是没有改变实体的状态,而不是它最初加载时的状态