hibernate悲觀鎖和樂觀鎖

2021-08-26 04:03:25 字數 1102 閱讀 7175

1.悲觀鎖

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

基於jdbc實現的資料庫加鎖如下:

select * from account where name="test" for update

在更新的過程中,資料庫處於加鎖狀態,任何其他的針對本條資料的操作都將被延遲。本次事務提交後解鎖。

而hibernate悲觀鎖的具體實現如下:

string sql="查詢語句";

query query=session.createquery(sql);

query.setlockmode("物件別名",lockmodel.upgrade);

session.load(person.class, 1,lockmode.upgrade);

hibernate的加鎖模式:

lockmode.none:無鎖機制。

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

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

這三種加鎖模式是供hibernate內部使用的,與資料庫加鎖無關:

lockmode.upgrade:利用資料庫的for update字句加鎖。

只有在查詢開始之前(也就是hiernate生成sql語句之前)加鎖,才會真正通過資料庫的鎖機制加鎖處理。

2.樂觀鎖

樂觀鎖定(optimistic locking)則樂觀的認為資料的訪問很少發生同時訪問的問題,因而不作資料庫層次上的鎖定,為了維護正確的資料,樂觀鎖定採用應用程式上的邏輯實現版本控制的方法。

hibernate樂觀鎖

(一)在物件中增加乙個version屬性,提供get/set方法

(二)而在映像檔案中,我們使用optimistic-lock屬性設定version控制,屬性欄之後增加乙個標籤

當前事務如果正在試圖提交乙個過期資料,將會丟擲staleobjectstateexception異常,通過捕捉這個異常,我

們就可以在樂觀鎖校驗失敗時進行相應處理。

hibernate悲觀鎖和樂觀鎖

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

Hibernate 悲觀鎖和樂觀鎖

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

hibernate的 悲觀鎖和樂觀鎖

hibernate悲觀鎖 指的是對資料被外界 包括本系統當前的其他事務,以及來自 外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定 狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能 真正保證資料訪問的排他性。在資料有載入的時候就給其進行加鎖...