1

我有一个应用程序:

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
}

我没有使用版本字段显式配置乐观锁定。但是,如果两个请求并行运行,试图删除同一个对象,那么我有时会收到 HibernateOptimisticLockingFailureException,有时会收到“CustomException”。

在没有明确设置乐观锁定的情况下获得 HibernateOptimisticLockingFailureException 是否正常?休眠是否为分离的对象提供默认的乐观锁定?

你在做什么来处理这个 HibernateOptimisticLockingFailureException ?重试或使用“服务器忙”之类的默认消息通知用户?

4

1 回答 1

4

首先,HibernateOptimisticLockingFailureException是Spring的持久化异常翻译机制的结果。它被抛出以响应StaleStateException,其 javadoc 说:

当版本号或时间戳检查失败时抛出,表明 Session 包含陈旧数据(当使用带有版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生这种情况。

从常识来看,当数据修改语句返回意外的受影响行数时,就会发生乐观锁异常。它可能是由版本值不匹配以及根本没有行引起的。

为了确保该实体被实际删除,您可以尝试em.flush()在删除后立即刷新上下文并捕获它引发的异常(注意它应该是作为原因的子类)PersistenceExceptionStaleStateException

于 2011-01-06T21:09:28.540 回答