@[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幻讀 在同乙個事務中讀兩次得到不同的結果 針對插入和刪除 為了解決事務併發出現的三個問題...