樂觀鎖和悲觀鎖

2021-09-27 02:25:33 字數 918 閱讀 4986

樂觀鎖和悲觀鎖經常被詢問到,在這裡做一些總結
一.基礎概念

樂觀鎖和悲觀鎖一般是用來維持事務的完整性.來解決併發場景中的資料競爭問題

二.實現方式

cas(compare and swap)

cas操作邏輯: 如果記憶體位置等於預期的值,則將位置更新為新值,不然不進行操作.許多cas的操作是自旋的,如果操作不成功,會一直重新,知道操作成功

版本號機制

版本號機制的思路是在資料中增加乙個字段,每當資料被修改的時候,版本號加1.當某個執行緒查詢資料的時候,將資料的版本號一起查出來,當該執行緒更新資料的時候,判斷當前版本號與之前是不是一致,如果一致進行操作

悲觀鎖是呼叫的時候進行加鎖,使用完之後就不用加鎖

三.優缺點和適用場景

1.功能限制

cas只能保證單個變數的原子性,涉及到多個變數,cas是無能為例

2.競爭激烈程度

競爭不激烈的時候,樂觀鎖是更有優勢的,加鎖和解鎖都需要消耗資源

競爭激烈的時候,悲觀鎖是更有優勢的

3.樂觀鎖是不佳鎖的,只是判斷資料有沒有被其他執行緒進行更新

四.cas有哪些缺點?

1.aba 問題

(1) 執行緒1讀取記憶體資料為a

(2) 執行緒2將資料修改為b

(3) 執行緒2將資料修改為a

(4) 執行緒1進行cas操作

這種情況的cas會成功的,但是資料已經被修改過了 , 但是在乙個棧頂經過兩次或多次變化恢復原值,棧已經發生了變化

引入版本號,記憶體中的值發生一次變化,版本號都+1,進行cas操作的時候,不僅僅需要比較記憶體中的值,還需要比較版本號的值,這樣cas才能成功

2.高競爭下的開銷問題

併發衝突很大的情況下,cas不斷的進行自選,我們可以在這裡進行乙個閥門測試,如果重新嘗試的次數超過一定的值會失敗退出

樂觀鎖和悲觀鎖

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

樂觀鎖和悲觀鎖

併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...

樂觀鎖和悲觀鎖

為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...