是否为分离的对象休眠默认的乐观锁定?

时间:2011-01-06 20:50:10

标签: java hibernate jpa locking optimistic

我有一个应用程序:

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?使用“服务器忙”等默认消息重试或通知用户?

1 个答案:

答案 0 :(得分:4)

首先,HibernateOptimisticLockingFailureException是Spring的持久性异常转换机制的结果。这是为了回应StaleStateException,它的javadoc说:

  

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

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

为确保实际删除了实体,您可以尝试在删除后立即用em.flush()刷新上下文并捕获它抛出的异常(请注意它应该是PersistenceException的子类StaleStateException 1}}作为一个原因)。