redis--悲觀鎖、樂觀鎖
阿新 • • 發佈:2020-07-05
悲觀鎖:
很悲觀、認為什麼時候都會出問題、無論做什麼都加鎖、很影響效能
樂觀鎖:
1.很樂觀、認為什麼時候都不會出問題、所以不上鎖。更新資料的時候去判斷下,在此期間是否有人修改這個資料。
2.獲取version
3.更新時比較version
watch (監控、實現樂觀鎖)
監控測試、正常執行:
my-redis:0>set money 100 ########## 設定餘額 100 元 OK my-redis:0>set out 0 ####### 設定花費 0 元 OK my-redis:0>watch money ##### watch 監控 餘額OK my-redis:0>multi ########## 開啟事務 OK my-redis:0>decrby money 20 ####### 餘額 -20 QUEUED my-redis:0>incrby out 20 ######## 花費 +20 QUEUED my-redis:0>exec ######## 執行事務 80 20 my-redis:0>get money ############ 正常 !資料期間沒有發生變動,這個時候就正常執行成功
80 my-redis:0>
測試多執行緒修復值、使用樂觀鎖操作。(事務沒執行、執行前另一個執行緒改了餘額、監控的值發生變化、這時執行事務會失敗)
my-redis:0>get money #### 獲取到餘額是80 80 my-redis:0>watch money ##### 監控餘額 OK my-redis:0>multi #######開啟事務 (這時候另一個執行緒把餘額改成1000) OK my-redis:0>decrby money 10 ########餘額-10 QUEUED my-redis:0>incrby out 10 ########### 花費+10 QUEUED my-redis:0>exec ######### 執行事務失敗,因為監控的餘額在執行之前已經被改了 null
怎麼解決:在事務執行失敗後,解鎖 unwatch ,2.再重新獲取鎖,執行 提交
my-redis:0>unwatch #########解鎖 OK my-redis:0>watch money ######重新獲取鎖 監控 OK my-redis:0>multi ########開啟事務 OK my-redis:0>decrby money 10 QUEUED my-redis:0>incrby out 10 QUEUED my-redis:0>exec #########執行成功 990 30