![](/img/trans.png)
[英]Spring Hibernate LazyInitializationException on @Transactional
[英]Spring / Hibernate @Transactional not flushing transaction if followed by a second @Transactional call
我的 Spring 引导应用程序有一个奇怪的行为。
该应用程序的OpenSessionInView为false 。
我有一个 Controller 和一个服务,它公开了两个带有注释@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);
}
}
我的 Controller(案例 1):
@RequestMapping("/do/{myId}")
public String do(Model model, HttpServletRequest request) {
service.doA(myId);
service.doB(myId);
return "page";
}
在调试 SQL 的情况下,我看到在调用服务期间执行了 SELECT 查询。 但是我只看到 1 个 flush (several UPDATES) ,并且它在 service.doB() 完成并且该方法周围的 TransactionInterceptor 启动方法 invokeWithinTransaction 时完成,这很奇怪。
由于这两种方法都有@Transactional,我希望看到 2 次刷新:第一次刷新在 service.doA() 结束时,第二次在 service.doB() 结束时刷新。
更奇怪的是,如果我评论第二个电话,那么
我的 Controller(案例 2):
@RequestMapping("/do/{myId}")
public String do(Model model, HttpServletRequest request) {
service.doA(myId);
//service.doB(myId);
return "page";
}
在情况 1 中,就像 service.doA() 知道第二个调用将在同一个 object 之后到达,因此它不会提交/刷新事务并等待 service.doB() 结束。
为什么我只看到 1 次冲洗? 是因为这两个调用都在某个 DB object 上吗?
我认为我对@Transactional 的了解还可以。 但是现在,我迷路了。
Hibernate 将检测 object 是否真的脏,如果没有必要,避免发送UPDATE
语句。 我假设您的updateMyObject
根本没有改变实体的 state 相对于它最初加载时的 state。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.