1. 程式人生 > 其它 >MySQL樂觀鎖、悲觀鎖

MySQL樂觀鎖、悲觀鎖

樂觀鎖、悲觀鎖

  • 悲觀鎖,是屬於資料庫中的一種鎖機制,但是樂觀鎖並非真正的資料庫鎖
  • 兩種鎖都是資料庫在應對併發操作時,防止出現資源搶奪的,基於不同人生觀所實現兩種解決方案

悲觀鎖

資料庫終端操作:

begin;  -- 開啟事務
select * from db_student where student_id = 5 for update; -- 新增一把更新鎖【悲觀鎖】  在事務提交之前,任何第三方連線都不能修改 student_id = 5這條資料 
commit; -- 提交事務

悲觀鎖問題:

1. 提前鎖定資料,形成序列化,形成阻塞,不利於效能發揮,不適用高併發場景。
2. 悲觀鎖只能保證資料的一致性,不能保證髒資料的出現

樂觀鎖

樂觀鎖的出現就是為了解決悲觀鎖的問題

舉例說明:

舉例:雙11活動,商城裡面id=5的商品的庫存=10了,現在我們要基於樂觀鎖和悲觀鎖來解決下單過程中,出現的資源搶奪現象,避免出現超賣(商品數量不能為負數)。

樂觀鎖:
---> begin;  開啟事務
---> 先檢視庫存,記錄當前庫存 num=10
---> 進行下單操作,買6件
---> 付款
---> 扣除庫存 update goods set num=num-6 where num=10 and id=5;  # 增加更新條件,判斷庫存是否還是原來
---> 如果執行成功,則表示沒有人搶,購買成功
     如果執行事變,則表示已經有人先搶購
---> commit;

悲觀鎖:
---> begin; 開啟事務
---> 先給id=5的資料,加鎖
     select * from goods where id=5 for update;
---> 進行下單操作,買6件
---> 付款
---> 扣除庫存  update goods set num=num-6 where id=5
---> 執行成功解鎖
---- commit;  提交事務