【引用】http://www.tongyi.net/develop/Java/1025649.html
Hibernate的加鎖模式有:
? LockMode.WRITE :Hibernate在Insert和Update記錄的時候會自動獲取。
???????? 這種鎖機制一般由Hibernate內部使用,如Hibernate為了保證Update過程中對象不會被外界修改,會在save方法實現中自動為目標對象加上WRITE鎖。
? LockMode.NONE : 無鎖機制。
? LockMode.READ : Hibernate在讀取記錄的時候會自動獲取。//select id from User where id =?
? LockMode.UPGRADE :利用數據庫的for update子句加鎖。//select id from User where id =? for update
? LockMode. UPGRADE_NOWAIT :Oracle的特定實現,利用Oracle的for update nowait子句實現加鎖。
上面這幾種鎖機制是我們在應用層較為常用的,加鎖一般通過以下方法實現:
Criteria.setLockMode
Query.setLockMode
Session.lock
注意,只有在查詢開始之前(也就是Hiberate 生成SQL 之前)設定加鎖,才會
真正通過數據庫的鎖機制進行加鎖處理,否則,數據已經通過不包含for update
子句的Select SQL加載進來,所謂數據庫加鎖也就無從談起。
?
Hibernate 在其數據訪問引擎中內置了樂觀鎖實現。如果不用考慮外部系統對數據庫的更新操作,
利用Hibernate提供的透明化樂觀鎖實現,將大大提升我們的生產力。
Hibernate中可以通過class描述符的optimistic-lock屬性結合version描述符指定。
現在,我們為之前示例中的TUser加上樂觀鎖機制。
1. 首先為TUser的class描述符添加optimistic-lock屬性:
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>
……
? none
無樂觀鎖
? version
通過版本機制實現樂觀鎖
? dirty
通過檢查發生變動過的屬性實現樂觀鎖
? all
通過檢查所有屬性實現樂觀鎖
其中通過version實現的樂觀鎖機制是Hibernate官方推薦的樂觀鎖實現,同時也
是Hibernate中,目前唯一在數據對象脫離Session發生修改的情況下依然有效的鎖機
制。因此,一般情況下,我們都選擇version方式作為Hibernate樂觀鎖實現機制。