悲觀鎖 詳解悲觀鎖和樂觀鎖

2021-10-16 03:22:51 字數 2185 閱讀 1742

背景

考慮下面兩個併發帶來的問題:

1、丟失更新:乙個事務的更新結果覆蓋了其它事務的更新結果,即所謂的更新丟失。

2、髒讀:當乙個事務讀取其它完成一半事務的記錄時,就會發生髒讀取。

例如:兩個使用者同時修改商品庫存表,a、b同時進入,看到的庫存都是100,a購買一件把庫存修改為99(100-1)。此時b購買兩件把庫存修改為98(100-2),因為a、b同時讀到的庫存都是100,b並不能看到a做的庫存更新,所以造成b髒讀,造成a丟失更新。

所以為了解決這些併發帶來的問題。 我們需要引入併發控制機制--鎖。

鎖分類

悲觀鎖悲觀鎖就是使用者修改資料時看起來很悲觀,保守態度,擔心別的使用者會同時修改這條資料,所以每次修改時會提前把這條資料鎖定起來,只有自己可修改(但別的使用者可以讀),等自己修改完了再釋放鎖。

樂觀鎖

樂觀鎖就是使用者修改資料時心態很樂觀,不管別人修改不修改資料,我都不上鎖,我修改的時候判斷下資料有沒有發生變化,沒發生變化我就會更新成功,發生變化了就不會更新成功我再去重試之前的動作直到更新成功。

鎖應用

悲觀鎖使用悲觀鎖的時候我們首先必須關閉mysql資料庫的自動提交屬性,因為mysql預設使用autocommit模式,也就是說,當你執行乙個更新操作後,mysql會立刻將結果進行提交。

關閉命令為:set autocommit=0;

悲觀鎖一般使用select…for update實現,在執行的時候會鎖定資料,雖然會鎖定資料,但是不影響其他事務的普通查詢使用。

在我們使用悲觀鎖的時候事務中的語句例如:

//開始事務begin;/begin work;/start transaction; (三選一)//查詢資訊select * from order where id=1 for update;//修改資訊update order set name='names';//提交事務commit;/commit work;(二選一)
此處的查詢語句for update關鍵字,在事務中只有select ... for update 或lock in share mode 同一條資料時會等待其它事務結束後才執行,一般的select查詢則不受影響。

執行事務時關鍵字select…for update會鎖定資料,防止其他事務更改資料。但是鎖定資料也是有規則的。

查詢條件與鎖定範圍:

比如查詢條件為主鍵id=1等等,如果此條資料存在,則鎖定當前行資料,如果不存在,則不鎖定。

比如查詢條件為主鍵id>1等等,此時會鎖定整張資料表。

會鎖定整張資料表。

明確指定索引並且查到,則鎖定整條資料。如果找不到指定索引資料,則不加鎖。

樂觀鎖

例如表

student(id,name,version)1 a 1
當事務一進行更新操作:

update student set name='txt' where id = # and version = #;
此時操作完後資料會變為id = 1,name = txt,version = 2,當另外乙個事務二同樣執行更新操作的時候,卻發現version != 1,此時事務二就會操作失敗,從而保證了資料的正確性。

樂觀鎖圖示

結論兩種鎖各有優缺點,不能單純的定義哪個好於哪個。樂觀鎖比較適合資料修改比較少,讀取比較頻繁的場景,即使出現了少量的衝突,這樣也省去了大量的鎖的開銷,故而提高了系統的吞吐量。但是如果經常發生衝突(寫資料比較多的情況下),上層應用不不斷的retry,這樣反而降低了效能,對於這種情況使用悲觀鎖就更合適。

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...

悲觀鎖和樂觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...