我有一个应用程序可以执行以下操作:

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为原因)。

08-19 07:55