重复保存Endpoint实体触发OptimisticLockException问题求助
求助:OptimisticLockException 循环出现的诡异问题
各位好,我最近碰到一个特别棘手的问题,折腾了好久没找到根源,想请大家帮忙分析下思路。
我的技术栈是JavaEE、PostgreSQL、JSF2.2、Primefaces,现在遇到的情况是:首次保存Endpoint实体完全正常,但再次保存就会抛出OptimisticLockException,错误提示“行已被其他事务更新或删除”。更诡异的是,报错之后再点保存又能成功,然后再保存又失败,呈现“成功→失败→页面重载→成功→失败”的循环状态。
已经做过的排查和尝试
- 翻遍了Stack Overflow上相关问题,排查过版本号维护、并发修改这些常见场景,但我的问题情况有特殊性
- 仔细检查过Endpoint实体的所有关联关系和子实体,没发现异常的更新操作
- 试过两种更新方式:
super.update:底层调用EntityManager.merge方法super.updateNoMerge:仅执行更新前后的触发器逻辑,不触发merge操作
不管用哪种方式,第二次更新时都会在执行count查询的环节触发异常
相关代码说明
- Endpoint实体:带有
@Version注解的实体类,通过版本号字段实现乐观锁控制,字段维护逻辑看起来正常 - EndpointService:负责实体的保存更新逻辑,依赖父类的update/updateNoMerge方法完成核心操作
- persistence.xml:配置了PostgreSQL数据源及JPA基础属性,没有特殊的锁策略配置
错误日志核心信息
javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [org.meveo.model.technicalservice.endpoint.Endpoint#xxx]
异常堆栈指向count查询执行阶段,最终在事务提交时触发版本校验失败
有没有大佬遇到过类似的循环异常情况?求给点排查方向或者解决思路,万分感谢!
内容的提问来源于stack exchange,提问作者czetsuya
相关产品推荐
相关产品推荐

