一个开启多个事务导致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();
}
}
原创文章,欢迎转载,转载请注明出处!
一个开启多个事务导致OptimisticLockException异常的问题的更多相关文章
- 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
@Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- Fragment已经被added了导致的异常。
java.lang.IllegalStateException: Fragment already added: ******Effect 出现的原因是commit方法提交是异步的,所以容易出现,判 ...
- 【原创】访问Linux进程文件表导致系统异常复位的排查记录
前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需 ...
- 第四章 TCP粘包/拆包问题的解决之道---4.2--- 未考虑TCP粘包导致功能异常案例
4.2 未考虑TCP粘包导致功能异常案例 如果代码没有考虑粘包/拆包问题,往往会出现解码错位或者错误,导致程序不能正常工作. 4.2.1 TimeServer 的改造 Class : TimeServ ...
- (转)SpringBoot非官方教程 | 第七篇:springboot开启声明式事务
springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...
- SpringBoot非官方教程 | 第七篇:springboot开启声明式事务
转载请标明出处: http://blog.csdn.net/forezp/article/details/70833629 本文出自方志朋的博客 springboot开启事务很简单,只需要一个注解@T ...
- VS2012外接程序VMDebugger未能加载或导致了异常
转http://blog.csdn.net/maryhuan/article/details/42676915 故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugg ...
- MySQL Replication--修改主键为NULL导致的异常
测试环境:MySQL 5.5.14/MySQL 5.6.36 测试脚本: create table tb001(id int primary key,c1 int); alter table tb00 ...
随机推荐
- UVA10559&POJ1390 Blocks 区间DP
题目传送门:http://poj.org/problem?id=1390 题意:给出一个长为$N$的串,可以每次消除颜色相同的一段并获得其长度平方的分数,求最大分数.数据组数$\leq 15$,$N ...
- Bootstrap栅栏布局里col-xs-*、col-sm-*、col-md-*、col-lg-*之间的区别及使用方法
原文:Bootstrap栅栏布局里col-xs-*.col-sm-*.col-md-*.col-lg-*之间的区别及使用方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- WPF C#截图功能 仿qq截图
原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...
- mysql中Error : Invalid default value for 'timestamp'问题
在执行mysql数据库时报错 timestamp给默认值出问题. 原因是:mysql的配置参数中sql_node中NO_ZERO_IN_DATE, NO_ZERO_DATE控制了times ...
- WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型
首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...
- STM32 M3内核的位带操作原理及步骤
STM32 M3内核的位带操作原理及步骤 一.位带操作有什么用?什么是位带操作 位带操作的作用:可以实现对某一GPIO口寄存器(或SRAM内存中)的某一bit位直接写0或1,达到控制GPIO口输出(或 ...
- Bayesian Personalized Ranking 算法解析及Python实现
1. Learning to Rank 1.1 什么是排序算法 为什么google搜索 ”idiot“ 后,会出现特朗普的照片? “我们已经爬取和存储了数十亿的网页拷贝在我们相应的索引位置.因此,你输 ...
- Python基础(中)
前言 print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") print(&q ...
- sudo 与输出重定向
本文介绍如何使用 sudo 将输出重定向到当前用户没有权限的文件.注意:本文中 demo 的演示环境为 ubuntu 18.04. Permission denied 问题 如果当前用户没有某个文件的 ...
- proxy_pass反向代理配置中url后面加不加/的说明
在日常的web网站部署中,经常会用到nginx的proxy_pass反向代理,有一个配置需要弄清楚:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把loca ...