1. 程式人生 > >樂觀鎖和悲觀鎖理解和應用場景

樂觀鎖和悲觀鎖理解和應用場景

一、鎖的含義

樂觀鎖:
    顧名思義,對當前操作的資料保持一個樂觀的態度,認為不會有其他事務操作修改當前的資料記錄。只有在提交事務更新時,會檢測有沒有被修改。若有則直接選擇retry或定義的操作。例子:hiberante的version版本控制

悲觀鎖:
    悲觀鎖認為其他事務會對操作的資料進行修改,所以當查詢時將資料上鎖。若其他事務需要操作該資料則需要等待。例子:資料庫中的行鎖,表鎖。

二、應用場景

樂觀鎖
   說應用場景之前,先要明白樂觀鎖是為了防止事務更新丟失。先講一下更新丟失的問題。下面舉個例子說明一下
商品扣庫存的例子:
image

最終正確的庫存應該為98。而上面發生了更新丟失,所以導致庫存數不正確
為了解決這個問題,可以採用版本號進行控制
image

三、如何選擇

需要結合這兩種鎖的特點,進行合理的選擇
- 響應速度:選擇樂觀鎖。要麼衝突失敗要麼快速成功。悲觀鎖則需要等待釋放鎖才能被執行
- 衝突頻率:頻率高的話不應選擇樂觀鎖,需要重試好幾次,代價大。而悲觀鎖保證成功率
- 重試代價:若重試代價大則選擇悲觀鎖