一个开启多个事务导致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