我有一个应用程序:
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”。 / p>
在没有显式设置乐观锁定的情况下获取HibernateOptimisticLockingFailureException是否正常?是否对分离的对象进行默认的乐观锁定?
你在做什么来处理这个HibernateOptimisticLockingFailureException?使用“服务器忙”等默认消息重试或通知用户?
答案 0 :(得分:4)
首先,HibernateOptimisticLockingFailureException
是Spring的持久性异常转换机制的结果。这是为了回应StaleStateException
,它的javadoc说:
当版本号或时间戳检查失败时抛出,指示Session包含过时数据(当使用具有版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生这种情况。
从常识来看,当数据修改语句返回意外数量的受影响行时,会发生乐观锁定异常。这可能是由版本值不匹配以及根本没有行引起的。
为确保实际删除了实体,您可以尝试在删除后立即用em.flush()
刷新上下文并捕获它抛出的异常(请注意它应该是PersistenceException
的子类StaleStateException
1}}作为一个原因)。