異常信息: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(); } }
原創文章,歡迎轉載,轉載請注明出處!