2012-04-12 75 views
11

我有一個關於Hibernate中樂觀鎖定的問題。我試圖深入與Hibernate進行樂觀鎖定,但我有一個疑問。 Hibernate使用版本方法(整數或時間戳)來實現樂觀鎖定。要進行配置,您可以使用@Version註釋(或xml配置)並創建一個版本屬性。另一種選擇是使用optimistic-lock =「all」屬性進行配置而不使用版本控制。默認情況下在休眠狀態下進行樂觀鎖定

我的問題是,如果你沒有定義任何版本屬性,也沒有指定樂觀鎖屬性,在這種情況下哪種策略使用Hibernate? Pessimistc鎖定我非常肯定,不,所以我認爲這是樂觀鎖定,但不知道如何。

非常感謝您的關注。

回答

33

如果您沒有配置Hibernate使用樂觀鎖定,它根本不使用鎖定。所以,在這種情況下,上次更新總是會獲勝。

爲了說清楚,請注意,Hibernate樂觀鎖定與DBMS事務隔離完全不同。 Hibernate樂觀鎖定僅適用於在一個事務中加載對象,修改它並稍後將其保存在另一個事務中的情況。在這種情況下,樂觀鎖確保其他一些事務沒有改變數據庫中的那個對象。但是,樂觀鎖定不會影響併發事務的隔離 - 因此,無論是否啓用Hibernate鎖定,DBMS內部用於實現事務隔離的鎖定(樂觀或悲觀)仍然有效。

3

@axtavt,你說得對,但是如果沒有@Version列,hibernate會實現樂觀鎖定的問題。可

今天4 OptimisticLockType選項:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

我認爲這足以回答原來的問題。