[英]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.