Hibernate中的悲觀鎖和樂觀鎖

2021-10-24 12:02:12 字數 1690 閱讀 1773

@[toc]hibernate中的悲觀鎖和樂觀鎖

用途:主要用來解決併發問題。鎖是一種排他性的操作

悲觀鎖:對資料庫的記錄加鎖,不支援懶載入.

實現策略:通常依賴於資料庫機制,在整個過程中將資料鎖定,其它任何使用者都不能讀取或修改,適合於短事物的操作.

加鎖**:

inventory inv =

(inventory)session.load

(inventory.

class,1

, lockmode.upgrade)

;//查詢記錄的時候順便加了乙個悲觀鎖

//由於悲觀鎖並不支援懶載入,所以一執行這個語句就會傳送sql語句進行查詢。

session.

gettransaction()

.commit()

;// commit之後自動解鎖

樂觀鎖:通過更改版本號來實現。並不算是真正的鎖,支援懶載入

樂觀鎖的併發性比較好,但是處理事物的操作不是很好.

實現策略:

樂觀鎖的使用策略:大多數基於資料版本記錄機制(version)實現,一般是在資料庫表中加入乙個version欄位,讀取資料時將版本號一同讀出,之後更新資料時版本號加一,如果提交資料時版本號小於資料表中的版本號,則認為資料是過期的,否則給予更新。

看**:

//實體類**

public

class

inventory

{private

int itemno;

private string itemname;

private

int quantity;

private

int version;

//這個屬性一定要是整型,在hbm中定義由hibernate來控制。

//相應的hbm檔案

<

?xml version=

"1.0"

?>

<

>

<

class

name

="com.bjsxt.hibernate.inventory" table=

"t_inventory"

optimistic-lock=

"version"

>

//表示樂觀鎖的版本號欄位為version欄位

"itemno"

>

="native"

/>

<

/id>

"version"

/>

//樂觀鎖欄位

"itemname"

/>

"quantity"

/>

<

/class

>

<

使用:

inventory inv =

(inventory)session.

load

(inventory.

class,1

);直接使用即可,hibernate會自己根據版本號和id號載入物件,如果版本號中途被

修改了,就會出異常。支援懶載入。

hibernate樂觀鎖和悲觀鎖

談到悲觀鎖和樂觀鎖,就要談到資料庫的併發問題,資料庫的隔離級別越高併發性就越差 併發性 當前系統進行了序列化後,你讀取資料庫後,別人查詢不了,稱為併發性不好 具有排它性 我鎖住當前資料後,比人看不到此資料 悲觀鎖一般是由資料庫機制來做到的 悲觀鎖的實現 通常依賴於資料庫機制,在整修過程中將資料庫鎖定...

Hibernate中悲觀鎖和樂觀鎖

hibernate中經常用到當多個人對同一資料同時進行修改的時候,會發生髒資料,造成資料的不一致性,解決辦法是可以通過悲觀鎖和樂觀鎖來實現。悲觀鎖 在資料有載入的時候就給其進行加鎖,直到該鎖被釋放掉,其他使用者才可以進行修改,優點 資料的一致性保持得很好,缺點 不適合多個使用者併發訪問。當乙個鎖住的...

hibernate悲觀鎖 樂觀鎖

1.多個事務併發會出現的錯誤情況 1 dirty read髒讀 讀了其他事務沒有提交的資料 2 none repeatable read不可重複讀 在同乙個事務中讀兩次得到不同的結果 3 phantom read幻讀 在同乙個事務中讀兩次得到不同的結果 針對插入和刪除 為了解決事務併發出現的三個問題...