受欢迎的模板网站建设好的建网站的公司

张小明 2026/3/2 18:20:51
受欢迎的模板网站建设,好的建网站的公司,华强北网上商城,中国免费的企业名录—— clear() 一个集合#xff0c;为什么引发 OptimisticLockException 和数据库死锁#xff1f;这是一次看似“新增 / 查询”的普通业务操作#xff0c;却最终演变成 Hibernate 乐观锁异常 MySQL 死锁 批量更新失败 的连环事故。一、问题现象线上频繁出现如下异常#x…—— clear() 一个集合为什么引发 OptimisticLockException 和数据库死锁这是一次看似“新增 / 查询”的普通业务操作却最终演变成Hibernate 乐观锁异常 MySQL 死锁 批量更新失败的连环事故。一、问题现象线上频繁出现如下异常javax.persistence.OptimisticLockException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1伴随的数据库日志还有Deadlock found when trying to get lock; try restarting transaction SQL: delete from km_agreement_review_areader where fd_source_id?诡异点在于表面调用的是新增审计意见 / 新增参数堆栈中指向的是find()查询实际报错却是update / delete涉及的表包括km_agreement_review_areaderlbpm_execution怎么看都不像是一个地方的问题。二、第一个误区find / insert 不会触发乐观锁这是一个非常常见的误区。在 Hibernate / JPA 中只要触发了 flush所有被托管managed的实体都会被统一同步到数据库。也就是说insert A find B在 Hibernate 内部真实执行顺序是flush Session ├─ update / delete / insert之前积攒的 └─ 然后才是 find B异常只是“挂”在 find 上真正出问题的是 flush 里的 update / delete。三、真正的导火索BaseAuthModel 里的clear()所有业务 Model 都继承了一个公共父类public abstract class BaseAuthModel { protected List authAllReaders; protected void recalculateReaderField() { if (authAllReaders null) { authAllReaders new ArrayList(); } else { authAllReaders.clear(); // 关键代码 } // 重新 add 各种 reader authAllReaders.add(getDocCreator()); ... } }这一行代码看起来极其“正常”authAllReaders.clear();但在Hibernate 眼里这是一个非常危险的操作。四、Hibernate 视角clear() 到底干了什么假设映射关系是OneToMany JoinColumn(name fd_source_id) private ListReader authAllReaders;那么authAllReaders.clear();在 Hibernate 中等价于delete from km_agreement_review_areader where fd_source_id ?如果接下来你又authAllReaders.add(...) authAllReaders.add(...)Hibernate flush 时会执行delete from km_agreement_review_areader where fd_source_id ? insert into km_agreement_review_areader ... insert into km_agreement_review_areader ...五、为什么会死锁关键点fd_source_id是外键当多个并发请求同时操作同一个业务对象时线程 Aclear → delete持有子表行锁线程 Bclear → delete等待线程 A后续 update 父表 / execution线程 B持有另一批锁典型的 InnoDB 死锁模型DELETE 子表 → UPDATE 父表 → DELETE 子表另一个事务六、为什么又会触发 OptimisticLockException系统中只有一个地方配置了 versionversion namelockerVersion columnfd_locker_version typelong/配置在lbpm_execution表。而问题在于lbpm_execution在流程执行时早已被加载进 Sessionclear / add Reader 的过程中execution 被标记为 dirtyflush 时 Hibernate 会顺带执行update lbpm_execution set fd_locker_version fd_locker_version 1 where fd_id ? and fd_locker_version ?如果前面发生了死锁回滚并发已更新行被别的事务影响 update 0 行 Hibernate 判定并发冲突 抛OptimisticLockException七、为什么堆栈看起来“很乱”因为这是统一 flush 导致的错觉报错点挂在find()实际执行的是delete 子表update executionHibernate不会告诉你是哪一个实体被判定 dirty这也是 Hibernate 最反直觉的地方之一。八、问题的本质总结一句话这是一个典型的ORM 管理集合 clear 并发 version共同作用下的“架构级事故”九、解法一最推荐绕过 ORM 管理这个集合❌ 错误姿势当前做法OneToMany private List authAllReaders;并对其clear() add()✅ 正确姿势 1不做批量异常在新增只做增量这里有现成方案可以关注后续.....,public void update(IBaseModel modelObj) throws Exception { IFieldsCalculator fieldsRecalculator modelObj.getFieldsCalculator(); if(fieldsRecalculator!null){ fieldsRecalculator.recalculateFields(); }else{ modelObj.recalculateFields(); } //modelObj.recalculateFields(); afterRecalculateFields(modelObj); getHibernateTemplate().saveOrUpdate(modelObj); }model 实现接口IFieldsCalculator fieldsRecalculator modelObj.getFieldsCalculator();完成model 的可阅读者的增量更新。十、为什么这是“无解但必须改”的问题因为BaseAuthModel 是全局父类clear() 是高频路径并发下必然出现死锁乐观锁冲突Hibernate 在这里帮不了你必须从 ORM 设计上规避十一、最终总结Hibernate 非常适合“领域模型”但需谨慎操作“权限计算 / 批量 clear 重建”这种模型这次问题的真正收获不是“修一个 bug”而是明确了哪些集合不该交给 ORM 管明确了clear() 是 ORM 世界的核按钮明确了version 不该用在流程执行上下文上
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

慕课网网站开发背景如何开展网站推广

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式Packet Tracer新手引导系统,功能包括:1. 自动检测并指导安装过程 2. 基础界面导览 3. 分步完成第一个实验(如PC间ping测试) 4. 实时错误检测与…

张小明 2026/1/22 13:39:20 网站建设

信誉好的天津网站建设医院网站建设计划

confd版本控制完全指南:10个必须掌握的实战技巧 【免费下载链接】confd Manage local application configuration files using templates and data from etcd or consul 项目地址: https://gitcode.com/gh_mirrors/co/confd confd是一个基于模板和数据源的本…

张小明 2026/1/22 13:38:50 网站建设

太原北京网站建设公司哪家好小程序平台源码

抖音视频下载神器:告别保存难题,一键获取高清无水印内容 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 你是否曾经遇到过这样的情况:看到一个精彩的抖音视频,…

张小明 2026/1/22 13:38:19 网站建设

欧美风网站自己的网站怎么做排名

Ruffle字体系统深度解析:从字符编码到渲染优化的完整架构 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle Ruffle字体系统作为Flash Player模拟器的核心组件,在字符渲…

张小明 2026/1/22 13:37:48 网站建设

找人做网站价格担路网提供网站建设

小米运动步数自动化同步终极指南:免费智能修改微信支付宝数据 【免费下载链接】mimotion 小米运动刷步数(微信支付宝)支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 还在为每天运动步数不够而烦恼吗&#xff…

张小明 2026/1/22 13:37:17 网站建设

建设银行集团网站网站建设实训结论和体会

EPubBuilder是一款功能强大的在线EPUB电子书编辑器,让作者和内容制作者能够轻松创建和编辑电子书内容。这个开源项目采用HTML、CSS和JavaScript技术栈,提供了完整的EPUB格式支持,无需安装任何软件即可在浏览器中完成整个电子书制作流程。 【免…

张小明 2026/1/22 13:36:46 网站建设