最新要闻
- 焦点要闻:加油被惊喜到!一加11不杀后台:前一天打开的APP第二天还在
- 温子仁恐怖片新作《梅根》 拯救了北美院线一月票房
- 天天热点评!被假货逼疯的劳力士:终于坐不住了
- 全球快资讯:要的就是销量!特斯拉在新加坡优惠近7万
- 全球新资讯:豆瓣9.5高分动画!有家长炮轰《中国奇谭》画风吓哭孩子 网友不乐意了
- 加了国六B汽油 排气管喷水?网友犀利吐槽:我加了拉肚子
- 热讯:峰米S5 Rolling投影仪发布:360度可旋转支架 还能当音箱用
- 世界热推荐:米哈游创始人之一参与打造:国产独立游戏《微光之镜》今日发售
- 即时看!奥迪RS e-tron GT很好 但它仍是大众体系里最拧巴的产品
- 当前讯息:菜鸟将投2亿:补贴快递员爬楼送货上门
- 天天快看:iOS 16卡壳了
- 世界热推荐:OLED+彩色水墨翻转双屏!联想公布ThinkBook Plus Twist笔记本
- 天天微速讯:雷军爆料了!新机皇小米13 Ultra或将于MWC发布:影像堆料突破天际
- 焦点速看:因易增加儿童哮喘几率:美国或将禁止使用燃气灶
- 【环球播资讯】曾狠坑过乐视!中电熊猫被拉横幅维权:“还我血汗钱”
- 当前信息:129元 荣耀智能体脂秤3开售:Wi-Fi、蓝牙双连接
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天观察:SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
(资料图片仅供参考)
目录- 问题
- 原因
- 复现
- 附:报错日志
问题
- 报错日志:详见文章结尾
附:报错日志
程序ORM框架使用的SpringData JPA,程序中未配置@Version或者@OptimisticLocking注解,但是报了一个乐观锁异常。Cause By中可以看到数据是被其它线程更改了。
- 程序逻辑:
@Transactionvoid method(String name) { // 略 // @Lock(value = LockModeType.PESSIMISTIC_WRITE) // User findPessimisticWriteByUsername(String id); User user = findPessimisticWriteByUsername(name); if (user == null) { user = new User(); user.setUsername(name); } userDao.save(user);}
- 数据库:MySQL
原因
悲观锁 for update 是当前读,普通查询是快照读。
- 程序事务开始后,在悲观锁读之前,其它逻辑查询过一次数据库,所以数据库生成了一次快照
- 在悲观锁读之前,数据被删除了
- 然后程序悲观锁读数据不存在,所以新建了一条记录想插入到数据库中
- 但是save之前会select一次,这次是快照读,所以jpa判断数据存在,然后想要update,但是实际数据库中没有这条数据。update失败
复现
@Slf4j@Servicepublic class TestService { @Autowired private TestTableDao testTableDao; @SneakyThrows @Transactional public String testPessimisticWrite(String id) { log(TransactionAspectSupport.currentTransactionStatus().toString()); testTableDao.findById("111").ifPresent(System.out::println); TestTable testTable1 = testTableDao.findById(id).orElseGet(() -> null); log("finished query1 " + testTable1); TestTable testTable = testTableDao.findPessimisticWriteByUsername(id).orElseGet(() -> null); log("finished query2 " + testTable); TestTable testTable2 = testTableDao.findById(id).orElseGet(() -> null); log("finished query3 " + testTable2); if (testTable == null) { testTable = new TestTable().setUsername(id); } log("start save"); TestTable save = testTableDao.save(testTable); log("finished save " + save.getPassword()); return save.toString(); } private void log(String startQuery) { log.info(" ----------- " + Thread.currentThread().getName() + " --- " + startQuery); } }
在第一次TestTable testTable1 = testTableDao.findById(id).orElseGet(() -> null);
前打个断点。step1.调用这个方法查询一条数据库已有的数据2222
step2.到断点处程序停止,然后去数据库中删除2222
数据step3.放行方法
可以看到,只有select for update查询到的2222
是null,因为它是当前读。
程序最终会报一个乐观锁异常:
附:报错日志
org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [com.totainfo.entity.ppt.McsCarrier] with identifier [H66P0430]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.totainfo.entity.ppt.McsCarrier#H66P0430]at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:337)at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:531)at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:154)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at com.sun.proxy.$Proxy142.save(Unknown Source)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl.lambda$enhancedPorts$4(RetWcsSynchronizeSecsServiceImpl.java:351)at java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:891)at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl.enhancedPorts(RetWcsSynchronizeSecsServiceImpl.java:322)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl.subMainProc(RetWcsSynchronizeSecsServiceImpl.java:82)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl.subMainProc(RetWcsSynchronizeSecsServiceImpl.java:34)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl$$FastClassBySpringCGLIB$$a4ca3f32.invoke()at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)at com.totainfo.synchronize.RetWcsSynchronizeSecsServiceImpl$$EnhancerBySpringCGLIB$$b7e2b709.subMainProc()at com.totainfo.send.RetSendWcsSecsServiceImpl.handleS1F4(RetSendWcsSecsServiceImpl.java:137)at com.totainfo.send.RetSendWcsSecsServiceImpl.S1F3(RetSendWcsSecsServiceImpl.java:87)at com.totainfo.send.RetSendWcsSecsServiceImpl$$FastClassBySpringCGLIB$$dc9e2ffa.invoke()at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)at com.totainfo.send.RetSendWcsSecsServiceImpl$$EnhancerBySpringCGLIB$$7cd74661.S1F3()at com.totainfo.recieive.RetReceiveWcsSecsServiceImpl.scPauseCompleted(RetReceiveWcsSecsServiceImpl.java:2076)at com.totainfo.recieive.RetReceiveWcsSecsServiceImpl.subMainProc(RetReceiveWcsSecsServiceImpl.java:245)at com.totainfo.recieive.RetReceiveWcsSecsServiceImpl.subMainProc(RetReceiveWcsSecsServiceImpl.java:61)at com.totainfo.common.core.bean.base.serviceabstract.ICIMBaseServiceAbstract.mainProc(Unknown Source)at com.totainfo.common.core.bean.base.serviceabstract.ICIMBaseServiceAbstract$$FastClassBySpringCGLIB$$3038395b.invoke()at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)at com.totainfo.recieive.RetReceiveWcsSecsServiceImpl$$EnhancerBySpringCGLIB$$49e64182.mainProc()at com.totainfo.listener.RetWcsListener.rptId13(RetWcsListener.java:595)at com.totainfo.listener.RetWcsListener.receiveWcsS6F11(RetWcsListener.java:156)at com.totainfo.listener.RetWcsListener.subMainProc(RetWcsListener.java:69)at com.totainfo.serviceabstract.ICIMMcsAbstractService.mainProc(ICIMMcsAbstractService.java:32)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)at com.lmrj.util.spring.SpringContext.reInvoke(SpringContext.java:134)at com.lmrj.codec.secs.e.a.iiIiiIIIIi.???()(rb:21)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.totainfo.entity.ppt.McsCarrier#H66P0430]at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2649)at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3492)at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3355)at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3769)at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:201)at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344)at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:99)at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1349)at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)at com.sun.proxy.$Proxy121.flush(Unknown Source)at org.springframework.data.jpa.repository.support.SimpleJpaRepository.flush(SimpleJpaRepository.java:601)at com.totainfo.common.core.dao.BaseDaoImpl.save(Unknown Source)at sun.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.data.repository.core.support.ImplementationInvocationMetadata.invoke(ImplementationInvocationMetadata.java:72)at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:382)at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:205)at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:550)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:155)at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:130)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)... 53 common frames omitted
关键词: 的情况下
-
天天观察:SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
问题报错日志:详见文章结尾附:报错日志程序ORM框架使用的SpringDataJPA,程序中未配置@Version或者@Op...
来源: 天天观察:SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
Redis的客户端
每日时讯!关于19c RU补丁报错问题的分析处理
环球简讯:记录使用adb连接rn项目进行开发
焦点要闻:加油被惊喜到!一加11不杀后台:前一天打开的APP第二天还在
最新快讯!Python中高阶函数与装饰器教程
【新要闻】Python中的异常处理总结
flutter 效果实现 —— 全面屏效果
Mysql中的锁:表、MDL、意向锁、行锁
温子仁恐怖片新作《梅根》 拯救了北美院线一月票房
天天热点评!被假货逼疯的劳力士:终于坐不住了
全球快资讯:要的就是销量!特斯拉在新加坡优惠近7万
全球新资讯:豆瓣9.5高分动画!有家长炮轰《中国奇谭》画风吓哭孩子 网友不乐意了
全球今日报丨【首页】热销爆品开发修改商品值
加了国六B汽油 排气管喷水?网友犀利吐槽:我加了拉肚子
热讯:峰米S5 Rolling投影仪发布:360度可旋转支架 还能当音箱用
世界热推荐:米哈游创始人之一参与打造:国产独立游戏《微光之镜》今日发售
即时看!奥迪RS e-tron GT很好 但它仍是大众体系里最拧巴的产品
当前讯息:菜鸟将投2亿:补贴快递员爬楼送货上门
天天快看:iOS 16卡壳了
世界热推荐:OLED+彩色水墨翻转双屏!联想公布ThinkBook Plus Twist笔记本
天天微速讯:雷军爆料了!新机皇小米13 Ultra或将于MWC发布:影像堆料突破天际
焦点速看:因易增加儿童哮喘几率:美国或将禁止使用燃气灶
【环球播资讯】曾狠坑过乐视!中电熊猫被拉横幅维权:“还我血汗钱”
快消息!事件处理_2事件修饰符
flutter 基础 —— 事件监听
环球热门:JavaScript 将base64 转换为File
当前信息:129元 荣耀智能体脂秤3开售:Wi-Fi、蓝牙双连接
买699元手机送99元耳机!Redmi 12C价格跟米粉交个朋友
今晚20点抢京东大额红包 天猫年货节红包最后一天
每日动态!没了量子力学 你连手机都玩不了
焦点热讯:9.78万起 飞度堂弟新款东风本田来福酱上市:动力被砍、油耗不变
热门看点:Bonitasoft认证绕过和RCE漏洞分析及复现(CVE-2022-25237)
【世界快播报】操作系统 — 精髓与设计原理(第二章 操作系统概述)
速看:2023年手机还能怎样进化?三点方向
全球热议:干不过BBA!广汽讴歌退出中国市场:车型少 价格高
俄罗斯影院播放盗版《阿凡达2》:还是合法的!西方干瞪眼
【环球新视野】巴黎圣母院确认2024年重开!《刺客信条》花费2年还原
今日关注:接盘国服暴雪玩家!网易《无尽战区》明天开服 配置要求公布
每日热门:部分聚类算法简介及优缺点分析
时讯:记录--JS-SDK页面打开提示realAuthUrl错误
最新:5. 使用互斥量保护共享数据
环球新消息丨【Python爬虫实战项目】Python爬虫批量下载相亲网站数据并保存本地(附源码)
天天快看:什么是堆叠面积图?
热点在线丨老车主维权、新客户下单!特斯拉大降价后3天获3万辆订单
每日快讯!李斌:我们从来不把自己称作豪华品牌
当前观察:百度CreateAI开发者大会:李彦宏称2027前一线城市不再需要限购限行
当前热文:炒币亏了3个亿的美图满血复活了:全体员工发股票 搬入新大楼
过年微醺 RIO鸡尾酒大促!56元到手10瓶
软件开发入门教程网之MySQL NULL 值处理
环球关注:【首页】商品列表和单个商品组件封装
焦点报道:曝iPhone 15开始试产:采用国产灵动岛屏 京东方供货
天天看热讯:李想:理想L7小订最大用户群来自特斯拉车主
中国新能源汽车补贴13年:投入超1500亿元 覆盖317万辆车
13种Shell逻辑与算术,能写出5种算你赢!
提升代码可读性,减少if-else的几个小技巧
天天快看:携程梁建章建议:取消中考 缩短中小学学制 提前2年上班
时代变了!日系豪华败走中国:停产停售、官网504、全面退场
焦点速看:DOS初识
【天天播资讯】《春晚》收视率史低 2023年很多节目真实生活取材 这次必看
全球报道:干掉致命疾病!全球首款蜜蜂疫苗获批
转子发动机回归!马自达官宣:增程式版MX-30本月发布
环球速读:解决安卓四大不可能 李杰:一加11 16GB流畅用四年
环球快资讯:再也不怕侧方停车!现代展示e-Corner系统:还能“坦克掉头”
ElasticSearch必知必会-基础篇
环球快报:火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!
全球速递!开源动物行为分析实验箱(斯金纳箱)需求调研分析
世界看点:低代码开发:释放数字化生产力
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
百事通!成了!微信:视频号用户总使用时长接近朋友圈80%
天天要闻:开袋即食 一口弹牙 大牌优形肉肠0.99元/根(商超2.5元)
快资讯:期待!《生化危机4:重制版》威斯克或将登场
特斯拉门店:降价维权后销量翻倍!全国一天提车量超1万台
2023支付宝集五福最全攻略 神秘玩法千万别错过
琥珀银杏果是什么东西?琥珀银杏果是什么地方的菜?
兵长一米六是什么意思?兵长一米六顺口溜
美髯公指的是谁?美髯公是什么意思?
金坷垃是什么意思?金坷垃是什么时候的梗?
肥皂水是碱性还是酸性?肥皂水的主要化学成分是什么?
主角叫萧破天的小说有哪些?主角叫萧破天的全部小说
转世仁波切是什么意思?转世仁波切怎么认证?
电信拨打长途前面加什么?电信拨打长途要钱吗?
今日最新!金子塔图,自定义图表,伪漏斗图
环球今日报丨Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
dnf武极觉醒技能怎么点?DNF武极觉醒技能介绍
倒角外倒角内倒角怎么区分?倒角外倒角内倒角的区别有哪些?
申怡走进云南白沙湾小学开讲公益语文课 用语文点亮希望的灯火
【新视野】专心打造小米汽车!雷军已卸任多家小米旗下公司职务
天天新资讯:《中国奇谭》爆火出圈!淘宝周边已卖断货 网友建议快出小野猪毛刷
世界速看:特斯拉二把手上位之路:朱晓彤如何打动马斯克?
环球资讯:比特斯拉多卖40万辆 比亚迪提前锁定2022年全球新能源销冠
【环球热闻】日志瘦身骚操作:从 5G 优化到 1G。
重磅发布丨从云原生到 Serverless,先行一步看见更大的技术想象力
世界简讯:rsync使用技巧
最新快讯!美国要给飞机安装5G信号屏蔽仪:避免影响航空安全
足坛再无“大圣” 33岁老将贝尔宣布退役
世界报道:2023年世界航天首次失利!英国维珍轨道火箭异常:9颗卫星没了
极狐考拉发布首款智能亲子车:有侧滑门、自带电子安全座椅
你集齐五福了吗?扫这张图能拿额外福卡 每天都有
【全球新要闻】劳斯莱斯2022年销量刷百年纪录!土豪都喜欢定制车