簡體   English   中英

是否為分離的對象休眠默認的樂觀鎖定?

[英]Does hibernate a default optimistic locking for detached objects?

我有一個應用程序:

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
}

我沒有使用version字段顯式配置樂觀鎖定 。但是,如果兩個請求並行運行,嘗試刪除同一個對象,那么我有時會得到一個HibernateOptimisticLockingFailureException,有時會得到“CustomException”。

在沒有顯式設置樂觀鎖定的情況下獲取HibernateOptimisticLockingFailureException是正常的嗎? 是否為分離的對象休眠默認的樂觀鎖定?

你在做什么來處理這個HibernateOptimisticLockingFailureException? 使用“服務器忙”等默認消息重試或通知用戶?

首先, HibernateOptimisticLockingFailureException是Spring的持久性異常轉換機制的結果。 它是在響應StaleStateException拋出的,它的javadoc說:

當版本號或時間戳檢查失敗時拋出,指示Session包含過時數據(當使用帶有版本控制的長事務時)。 如果我們嘗試刪除或更新不存在的行,也會發生這種情況。

從常識來看,當數據修改語句返回意外數量的受影響行時,會發生樂觀鎖定異常。 它可能是由版本值不匹配以及根本沒有行引起的。

為了確保實際刪除了實體,您可以在刪除后立即嘗試通過em.flush()刷新上下文並捕獲它拋出的異常(請注意,它應該是具有StaleStateException作為原因的PersistenceException子類)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM