欢迎访问我的个人网站==》 jiashubing.cn

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

 

原创文章,欢迎转载,转载请注明出处!

posted @ 2017-09-01 16:56  贾树丙  阅读(3245)  评论(0编辑  收藏  举报