簡體   English   中英

Spring / Hibernate @Transactional 不刷新事務,如果后跟第二個 @Transactional 調用

[英]Spring / Hibernate @Transactional not flushing transaction if followed by a second @Transactional call

我的 Spring 引導應用程序有一個奇怪的行為。

該應用程序的OpenSessionInViewfalse

我有一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM