一個開啟多個事務導致OptimisticLockException異常的問題


  異常信息:org.eclipse.persistence.exceptions.OptimisticLockException
  對象在其他的事物中被修改,而造成這一個問題的原因是:同時開啟了兩個事務,修改了同一個對象。解決方式就是:讓對象在同一個事務中修改


  我使用的是cuba框架,這個框架可以使用 DataManager 來操作數據,也可以使用JPA的 EntityManager ,而DataManager每次執行都會新起一個事務。
  就是因為開始不懂這些,以為這兩個是同一回事,才出了錯。

 

錯誤示例

  首先使用了EntityManager查詢了對象,然后又使用DataManager新開了事務進行提交,這樣會報錯

public void backEnd(UUID entityId) {
    Transaction tx = persistence.getTransaction();
    try {
        EntityManager em = persistence.getEntityManager();
        ExcelTable excelTable = em.find(ExcelTable.class, entityId);
        ProcInstance procInstanceNormal = ProcUtils.findProcInstanceNoDel(dataManager,excelTable);
        if(procInstanceNormal != null){
            procInstanceNormal.setDescription("【銷毀申請】已完成");
            dataManager.commit(procInstanceNormal);         }
        tx.commit();
    } catch (Exception e) {
        logger.error("刪除流程excelTable " + entityId + "發生錯誤:" + e.getMessage());
    } finally {
        tx.end();
    }
}

 

正確用法

  修改成只使用EntityManager來修改對象就沒有問題了。 

@Inject
private Persistence persistence;
@Inject
private DataManager dataManager;
public void backEnd(UUID entityId) {
    Transaction tx = persistence.getTransaction();
    try {
        EntityManager em = persistence.getEntityManager();
        ExcelTable excelTable = em.find(ExcelTable.class, entityId);
        ProcInstance procInstanceNormal = ProcUtils.findProcInstanceNoDel(dataManager,excelTable);
        if(procInstanceNormal != null){
            procInstanceNormal.setDescription("【銷毀申請】已完成");
            em.merge(procInstanceNormal); em.flush();         }
        tx.commit();
    } catch (Exception e) {
        logger.error("刪除流程excelTable " + entityId + "發生錯誤:" + e.getMessage());
    } finally {
        tx.end();
    }
}

 

原創文章,歡迎轉載,轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM