码迷,mamicode.com
首页 > 其他好文 > 详细

一个开启多个事务导致OptimisticLockException异常的问题

时间:2017-09-01 17:52:04      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:uid   cti   merge   导致   esc   tde   backend   proc   except   

  异常信息: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();
    }
}

 

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

一个开启多个事务导致OptimisticLockException异常的问题

标签:uid   cti   merge   导致   esc   tde   backend   proc   except   

原文地址:http://www.cnblogs.com/acm-bingzi/p/cubaManager.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!