簡體   English   中英

方法完成時,Spring EntityManager提交事務

[英]Spring EntityManager Commit Transaction as method completes

我正在使用spring EntityManager並且需要在方法完成時提交記錄。 那就是我有兩種方法用於ex ::

    @Override
    @Transactional
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }

並且方法insertIntoDB包含實際上執行更新查詢的業務邏輯

    @Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

但是問題是該方法沒有提交,因為它返回upsert方法中的下一個循環。

如何完成方法?

檢查文檔

方法可見性和@Transactional

使用代理時,應僅將@Transactional注釋應用於具有公共可見性的方法。 如果使用@Transactional注釋對受保護的,私有的或程序包可見的方法進行注釋,則不會引發任何錯誤,但是帶注釋的方法不會顯示已配置的事務設置。 如果需要注釋非公共方法,請考慮使用AspectJ(請參見下文)。

即使您的方法是公共的,也要在同一類的另一個方法中調用它,所以您不會使用代理,並且insertIntoDB方法上的@Transactional(propagation=Propagation.REQUIRES_NEW)無效。

因此,請像文檔一樣在AspectJ模式下嘗試。

嘗試如下所示使用:

@Override
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void upsert(String lastSuccessfullRun) {
        for( tableData in Tables){
         insertIntoDB(tableData);
       }
    }



@Override
    @Transactional(propagation=Propagation.SUPPORTS)
    public void insertIntoDB (String tableData) {
        em.persist(tableData)
    }

如果在insertIntoDB方法中使用“ propagation = Propagation.REQUIRES_NEW”,則它將創建一個新事務,並在insertIntoDB方法完成時提交該事務。

@Transactional僅在調用方法throw proxy時起作用,因此在您的情況下不起作用。 如果您確實希望您的更改反映在與活動事務相關聯的數據庫和PersistenceContext中,則可以使用

EntityManager.flush();

但是請記住,使用flush()時,遇到刷新后,對數據的更改會反映在數據庫中,但是它仍處於事務中並且可以回滾並且事務仍處於活動狀態,但是當您使用commit()時,會進行更改進入數據庫,交易也就此結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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