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