悲觀鎖與樂觀鎖

2021-08-26 19:28:53 字數 1013 閱讀 9142

悲觀鎖: 指在應用程式中顯示地為資料資源加鎖. 悲觀鎖假定當前事務操縱資料資源時, 肯定還會有其他事務同時訪問該資料資源, 為了避免當前事務的操作受到干擾, 先鎖定資源. 儘管悲觀鎖能夠防止丟失更新和不可重複讀這類併發問題, 但是它會影響併發效能, 因此應該謹慎使用悲觀鎖.

樂觀鎖: 樂觀鎖假定當前事務操縱資料資源時, 不會有其他事務同時訪問該資料資源, 因此完全依靠資料庫的隔離級來自動管理鎖的工作. 應用程式採用版本控制手段來避免可能出現併發問題.

悲觀鎖有兩種實現方式:

一: 在應用程式中顯示指定採用資料庫系統的獨佔鎖來鎖定資料資源.

二: 在資料庫表中增加乙個表明記錄狀態的lock欄位, 當它取值為'y' 時, 表示該記錄已經被某個事務鎖定, 如果為n 表明該記錄處於空閒狀態, 事務可以訪問它.

當事務執行select 語句的時候, 預設情況下, 資料庫系統會採用共享鎖來鎖定查詢的記錄. 此外mysql oracle ms sql都支援以下形式的select 語句:

select ... for update
以上語句顯示的指定採用獨佔鎖來鎖定查詢的記錄.

在hibernate應用中, 當通過session的get() 和load() 方法來載入乙個物件時, 可以採用以下的方式宣告使用悲觀鎖:

session.get(***.class, new long(1), lockmode.upgrade)
利用hibernate的版本控制來實現樂觀鎖

樂觀鎖是由應用程式提供的一種機制, 這種機制既能保證多個事務併發訪問資料, 又能防止第二類丟失更新. 可以利用hibernate的版本控制功能來實現樂觀鎖.

在資料庫中加入乙個字段, version, 每次更新通過session中的實體物件的version屬性進行更新, 如session中version為0, 則where version = 0. 否則將丟擲異常.

悲觀鎖與樂觀鎖

悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...

樂觀鎖與悲觀鎖

悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次乙個事務讀取某一條記錄後,就會把這條記錄鎖住,這樣 其它的...

樂觀鎖與悲觀鎖

鎖 locking 這個概念在我們學習多執行緒的時候曾經接觸過,其實這裡的鎖和多執行緒裡面處理併發的鎖是乙個道理,都是暴力的把資源歸為自己所有。這裡我們用到鎖的目的就是通過一些機制來保證一些資料在某個操作過程中不會被外界修改,這樣的機制,在這裡,也就是所謂的 鎖 即給我們選定的目標資料上鎖,使其無法...