我有一个应用程序可以执行以下操作:
void deleteObj(id){
MyObj obj = getObjById(id);
if (obj == null) {
throw new CustomException("doesn't exists");
}
em.remove(obj);//em is a javax.persistence.EntityManager
}
我没有用版本字段显式配置optimistic locking。但是,如果两个请求并行运行,试图删除同一对象,则有时会收到HibernateOptimisticLockingFailureException,而有时会出现“ CustomException”。
在没有显式设置乐观锁定的情况下获取HibernateOptimisticLockingFailureException是否正常?是否为分离的对象休眠默认的乐观锁定?
您正在做什么以处理此HibernateOptimisticLockingFailureException?重试或通过默认消息(例如“服务器繁忙”)通知用户?
最佳答案
首先,HibernateOptimisticLockingFailureException
是Spring的持久性异常转换机制的结果。它是对StaleStateException
的响应而抛出的,其javadoc说:
当版本号或时间戳检查失败时抛出,表明会话包含陈旧数据(当使用带有版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生这种情况。
按照常识,当数据修改语句返回意外数量的受影响的行时,将发生乐观锁异常。这可能是由于版本值不匹配以及根本没有该行引起的。
为了确保该实体实际上已被删除,您可以尝试在删除后立即通过em.flush()
刷新上下文并捕获其引发的异常(请注意,它应该是PersistenceException
的子类,并且以StaleStateException
为原因)。