【引用】http://www.tongyi.net/develop/Java/1025649.html

Hibernate的加鎖模式有:

? LockMode.WRITE :Hibernate在Insert和Update記錄的時候會自動獲取。
???????? 這種鎖機(jī)制一般由Hibernate內(nèi)部使用,如Hibernate為了保證Update過程中對象不會被外界修改,會在save方法實現(xiàn)中自動為目標(biāo)對象加上WRITE鎖。

? LockMode.NONE : 無鎖機(jī)制。
? LockMode.READ : Hibernate在讀取記錄的時候會自動獲取。//select id from User where id =?
? LockMode.UPGRADE :利用數(shù)據(jù)庫的for update子句加鎖。//select id from User where id =? for update
? LockMode. UPGRADE_NOWAIT :Oracle的特定實現(xiàn),利用Oracle的for update nowait子句實現(xiàn)加鎖。
上面這幾種鎖機(jī)制是我們在應(yīng)用層較為常用的,加鎖一般通過以下方法實現(xiàn):
Criteria.setLockMode
Query.setLockMode
Session.lock
注意,只有在查詢開始之前(也就是Hiberate 生成SQL 之前)設(shè)定加鎖,才會
真正通過數(shù)據(jù)庫的鎖機(jī)制進(jìn)行加鎖處理,否則,數(shù)據(jù)已經(jīng)通過不包含for update
子句的Select SQL加載進(jìn)來,所謂數(shù)據(jù)庫加鎖也就無從談起

?

Hibernate 在其數(shù)據(jù)訪問引擎中內(nèi)置了樂觀鎖實現(xiàn)。如果不用考慮外部系統(tǒng)對數(shù)據(jù)庫的更新操作,
利用Hibernate提供的透明化樂觀鎖實現(xiàn),將大大提升我們的生產(chǎn)力。
Hibernate中可以通過class描述符的optimistic-lock屬性結(jié)合version描述符指定。
現(xiàn)在,我們?yōu)橹笆纠械腡User加上樂觀鎖機(jī)制。
1. 首先為TUser的class描述符添加optimistic-lock屬性:


name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>
……

optimistic-lock屬性有如下可選取值:
? none
無樂觀鎖
? version
通過版本機(jī)制實現(xiàn)樂觀鎖
? dirty
通過檢查發(fā)生變動過的屬性實現(xiàn)樂觀鎖
? all
通過檢查所有屬性實現(xiàn)樂觀鎖
其中通過version實現(xiàn)的樂觀鎖機(jī)制是Hibernate官方推薦的樂觀鎖實現(xiàn),同時也
是Hibernate中,目前唯一在數(shù)據(jù)對象脫離Session發(fā)生修改的情況下依然有效的鎖機(jī)
制。因此,一般情況下,我們都選擇version方式作為Hibernate樂觀鎖實現(xiàn)機(jī)制。