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

Hibernate的加鎖模式有:

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

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

?

Hibernate 在其數(shù)據(jù)訪問(wèn)引擎中內(nèi)置了樂(lè)觀鎖實(shí)現(xiàn)。如果不用考慮外部系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的更新操作,
利用Hibernate提供的透明化樂(lè)觀鎖實(shí)現(xiàn),將大大提升我們的生產(chǎn)力。
Hibernate中可以通過(guò)class描述符的optimistic-lock屬性結(jié)合version描述符指定。
現(xiàn)在,我們?yōu)橹笆纠械腡User加上樂(lè)觀鎖機(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
無(wú)樂(lè)觀鎖
? version
通過(guò)版本機(jī)制實(shí)現(xiàn)樂(lè)觀鎖
? dirty
通過(guò)檢查發(fā)生變動(dòng)過(guò)的屬性實(shí)現(xiàn)樂(lè)觀鎖
? all
通過(guò)檢查所有屬性實(shí)現(xiàn)樂(lè)觀鎖
其中通過(guò)version實(shí)現(xiàn)的樂(lè)觀鎖機(jī)制是Hibernate官方推薦的樂(lè)觀鎖實(shí)現(xiàn),同時(shí)也
是Hibernate中,目前唯一在數(shù)據(jù)對(duì)象脫離Session發(fā)生修改的情況下依然有效的鎖機(jī)
制。因此,一般情況下,我們都選擇version方式作為Hibernate樂(lè)觀鎖實(shí)現(xiàn)機(jī)制。