Hibernate中悲觀鎖和樂觀鎖

2022-09-18 04:51:31 字數 2931 閱讀 2116

hibernate中經常用到當多個人對同一資料同時進行修改的時候,會發生髒資料,造成資料的不一致性,解決辦法是可以通過悲觀鎖和樂觀鎖來實現。 

悲觀鎖:在資料有載入的時候就給其進行加鎖,直到該鎖被釋放掉,其他使用者才可以進行修改,優點:資料的一致性保持得很好,缺點:不適合多個使用者併發訪問。當乙個鎖住的資源不被釋放掉的時候,這個資源永遠不會被其他使用者進行修改,容易造成無限期的等待。 

樂觀鎖:就是在對資料進行修改的時候,對資料才去版本或者時間戳等方式來比較,資料是否一致性來實現加鎖。優點比較好。

j**a**  

1、在悲觀鎖中,只要在載入的時候,才去session中的load方法,進行枷鎖,session.load(****.

class,1

,lockmode.update)或sess.get(emp.class,

7369,lockoptions.upgrade);;  

hibernate將事務管理委託給底層的jdbc或者jta,預設是基於jdbc transaction的。  

hibernate支援「悲觀鎖(pessimistic locking)」和「樂觀鎖(optimistic locking)」。  

悲觀鎖對資料被外界修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制。hibernate通過使用資料庫的for

update子句實現了悲觀鎖機制。hibernate的加鎖模式有:  

1. lockmode.none:無鎖機制  

2. lockmode.write:hibernate在insert和update記錄的時候會自動獲取  

3. lockmode.read:hibernate在讀取記錄的時候會自動獲取  

4. lockmode.upgrade:利用資料庫的

forupdate子句加鎖  

5. lockmode.upgrade_nowait:oracle的特定實現,利用oracle的

forupdate nowait子句實現加鎖  

2、樂觀鎖大多是基於資料版本(version)記錄機制實現。hibernate在其資料訪問引擎中內建了樂觀鎖實現,可以通過

class

描述符的optimistic-lock屬性結合version描述符指定。optimistic-lock屬性有如下可選取值:  

1. none:無樂觀鎖  

2. version:通過版本機制實現樂觀鎖  

3. dirty:通過檢查發生變動過的屬性實現樂觀鎖  

4. all:通過檢查所有屬性實現樂觀鎖  

2、樂觀鎖: 

1>在悲觀鎖的基礎上加入private int version;和相關的setter、getter方法(資料庫中新增個字段version)。 

2>對映檔案配置在class標籤裡面加入optimistic-lock="version",然後在的id標籤後面加入

xml**  

<

>

<

class

name

=table

="t_lock"

optimistic-lock

="version"

>

<

idname

="id"

>

<

generator

class

="native"

/>

id>

<

version

name

="version"

type="j**a.lang.integer"

/>

<

property

name

="name"

/>

<

property

name

="totle"

/>

class

>

>

lazy策略可以用在: 

* 標籤上:可以取值true/false 

* 標籤上,可以取值true/false,

這個特性需要類增強 

* /等集合上,可以取值為

true/false/extra 

* /等標籤上,可以取值

false/proxy/no-proxy 

重要的概念: 

1、lazy的概念,指在需要的時候才發出sql 

2、lazy策略只是在session開啟期間才是有效的 

注意: 

hibernate類級別的lazy載入策略:可以控制什麼時候載入這些普通物件屬性 

hibernate集合屬性的懶載入策略: 

在集合屬性上,可以配置懶載入策略,取值為:true/false/extra 

true:預設取值,它的意思是只有在呼叫這個集合獲取裡面的元素物件時,才發出查詢語句,載入其集合元素的資料 

false:取消懶載入特性,即在載入物件的同時,就發出第二條查詢語句載入其關聯集合的資料 

extra:一種比較聰明的懶載入策略,即呼叫集合的size/contains等方法的時候,hibernate並不會去載入整個集合的資料,而是發出一條聰明的sql語句,以便獲得需要的值,只有在真正需要用到這些集合元素物件資料的時候,才去發出查詢語句載入所有物件的資料 

hibernate單端關聯懶載入策略:即在/標籤上可以配置 

懶載入策略。 

可以取值為:false/proxy/no-proxy 

false:取消懶載入策略,即在載入物件的同時,發出查詢語句,載入其關聯物件 

proxy:這是hibernate對單端關聯的預設懶載入策略,即只有在呼叫到其關聯物件的方法的時候才真正發出查詢語句查詢其物件資料,其關聯物件是**類no-proxy:這種懶載入特性需要對類進行增強,使用no-proxy,其關聯物件不是**類 

注意:在class標籤上配置的lazy屬性不會影響到關聯物件!!!

hibernate悲觀鎖和樂觀鎖

如果資料庫不加鎖,在多個使用者訪問的時候,有可能會造成不可重複讀的問題 如,兩個使用者進行更新,並且這兩個使用者都先後的拿到了表中的記錄的數值,a使用者更新比 b使用者先更新完,但 b使用者還是按照初始的值進行更新,這時候就會造成不可重複讀 此時可以通過hibernate的悲觀鎖機制,對 hiber...

hibernate悲觀鎖和樂觀鎖

1.悲觀鎖 它指的是對資料被外界修改持保守態度。假定任何時刻訪問資料時,都可能有另乙個客戶也正在訪問同一筆資料,為了保持資料被操作的一致性,於是對資料採取了資料庫層次的鎖定狀態,依靠資料庫提供的鎖機制來實現。基於jdbc實現的資料庫加鎖如下 select from account where nam...

Hibernate 悲觀鎖和樂觀鎖

悲觀鎖 認為在修改資料庫資料的這段時間裡存在著也想修改此資料的事務!樂觀鎖 認為在短暫的時間裡不會有事務來修改此資料庫的資料!悲觀鎖 基於jdbc實現的資料庫加鎖如下 select from account where name erica for update.在更新的過程中,資料庫處於加鎖狀態,...