樂觀鎖,悲觀鎖 隨手記

2021-08-22 00:25:11 字數 1292 閱讀 9917

對一條資料加了讀鎖的情況下,這條資料有且只有新增讀鎖。排它鎖、寫鎖是不行的

對一條資料加了寫鎖的情況下,這條資料不能新增寫鎖或者讀鎖。

鎖分類概述

樣例使用場景

悲觀鎖悲觀鎖對資料被外界修改持有保守狀態(悲觀的)

因此在整個資料處理過程中,將資料處於鎖定狀態

往往依靠資料庫提供的鎖機制實現。

可以理解為:悲觀鎖,態度是悲觀的,總是認為資料

在處理的時候會造成衝突,所以會把要修改的資料鎖定

行鎖,頁鎖,表鎖,共享鎖(讀鎖)

排它鎖(寫鎖)

寫多,讀少

保證資料安全

樂觀鎖樂觀鎖認為資料在處理的過程中不會造成衝突

所以在資料進行提交更新的時候,才會正式對

資料的衝突與否進行檢測,如果發生衝突,則

返回錯誤資訊給使用者,讓使用者決定如何去做

資料庫樂觀鎖,快取樂觀鎖

讀多,寫少,提高吞吐量

樂觀鎖吞吐量高的原因:只有在更新那條資料的一瞬間才會鎖表

資料庫樂觀鎖實現方案:

優點:簡單高效,穩定可靠

缺點:併發能力低

1、通過版本號實現

修改表結構,新增version 版本號列。每次去更新庫存的時候版本號+1。

update goods_info set amount = amount - # , version = version + 1

where code = # and version = #

2、通過狀態控制

判斷庫存減去購買量大於0

update goods_info set amout = amout - #

where code = # and amout-# >0

快取樂觀鎖實現方案:

使用cas(compare and swap)機制

步驟分析:讀取資料--->比較資料---->更新資料

場景分析:秒殺場景

秒殺的特點:

1、讀多寫少:比如搶票,200張票6000人來搶

2、短時高併發、負載壓力大

3、資源競爭有限,不能多賣,不能少賣,不能重賣

根據秒殺特點可以選用樂觀鎖來控制庫存操作。

service-----修改庫存方法流程:

獲取商品庫存物件---獲取商品庫存---判斷庫存是否足夠(庫存是否小於當前購買量)--獲取版本號

---帶上版本號更新庫存---更新失敗的當前執行緒休眠(休眠時間隨機)---遞迴呼叫修改庫存方法

基於快取實現秒殺---實現cas機制

悲觀鎖樂觀鎖

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

樂觀鎖 悲觀鎖

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

樂觀鎖 悲觀鎖

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