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

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

时间: 2024-11-09 05:55:19

一个开启多个事务导致OptimisticLockException异常的问题的相关文章

路径名导致的异常:javax.imageio.IIOException: Can't read input file!

背景: 写了一个测试程序,目的是读取本地的图片,为其打上水印图片.在使用过程中总会遇到:javax.imageio.IIOException: Can't read input file!的错误,最开始以为是图片路径名称写的不对,按照网上的提示换成正斜线和反斜线都不行.后来发现问题的原因是:图片的路径中不能有点(英文点:.); 具体的错误异常提示如下: javax.imageio.IIOException: Can't read input file! at javax.imageio.Imag

注册了listActivity而没有用导致的异常

昨天在修改一个已有代码的时候没有注意原来的代码是--extends listActivity 结果在加上xml文件后运行后出现了这样的情况:java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 后来仔细观察才知道以前面提到的这个问题.一下是一个网友的解释: "对于以上错误,其实可能是因为我们要实现对ListView中setOnItemClick

记录一次ARP故障导致网络异常

故障现象:单位某台PC出现无法打印故障,提示为下图 该PC重新设置打印机就能够使用但在重启之后无法连接到打印机,并且还会出现连接共享文件的时候会出现类似掉线的情况 分析过程:打印机为网络打印机 内存使用率仅有10% 所以排除1和3 剩下围绕着2的提示来解决 实践过程: 先从网络方面下手,利用IMCP的PING功能对打印服务器,打印机本身进行测试,结果为能PING通. 注!此时发现一个问题,服务器以及其他PC无法PING通本PC! 针对上述所说的故障对本PC进行了网卡驱动更新,系统重装,甚至更换网

Fragment已经被added了导致的异常。

java.lang.IllegalStateException: Fragment already added:  ******Effect 出现的原因是commit方法提交是异步的,所以容易出现,判断的时候是还没有added的状态,但是在真的添加的时候,重复添加了,其实就是一个同步异步的问题. 解决方式其实就是自己添加一个tag,每个fragment一个tag就可以解决重复添加导致的异常了. mAdded = new boolean[]{false, false, false, false,

(转)SpringBoot非官方教程 | 第七篇:springboot开启声明式事务

springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就默认开启.当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器. 准备阶段 以上一篇文章的代码为例子,即springboot整合mybatis,上一篇文章是基于注解来实现mybatis的数据访问层,这篇文章基于xml的来实现,并开启声明式事务. 环境依赖 在pom文件

企业级 SpringBoot 教程 (七)springboot开启声明式事务

springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就默认开启.当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器. 准备阶段 以上一篇文章的代码为例子,即springboot整合mybatis,上一篇文章是基于注解来实现mybatis的数据访问层,这篇文章基于xml的来实现,并开启声明式事务. 环境依赖 在pom文件

Java B2B2C多用户商城 springboot架构 (七)springboot开启声明式事务

springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就默认开启.当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器. 准备阶段 以上一篇文章的代码为例子,即springboot整合mybatis,上一篇文章是基于注解来实现mybatis的数据访问层,这篇文章基于xml的来实现,并开启声明式事务. 环境依赖 在pom文件

【原创】访问Linux进程文件表导致系统异常复位的排查记录

前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需要在内核里通过扫描该进程打开的文件表,获取文件的路径,和安全模块里配置的可访问文件的进程白名单进行匹配: 模块会一直到搜索到进程pid为1的进程,也就是init进程.在访问中间某个父进程的文件表时,出现struct task_struct的files指针为空的情况, 导致系统异常复位. 下面就是这次

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天     误信息如下: 经过逐步排查发现时因为我的方法中用了一个Model ,却把Model的包引入错误所以造成上面的问题: 错误引入的包为:import com.sun.tools.xjc.model.Model; 正确的包为: import org.springframework.ui.Model;