[英]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.