MySQL樂觀鎖、悲觀鎖
阿新 • • 發佈:2021-12-31
樂觀鎖、悲觀鎖
- 悲觀鎖,是屬於資料庫中的一種鎖機制,但是樂觀鎖並非真正的資料庫鎖
- 兩種鎖都是資料庫在應對併發操作時,防止出現資源搶奪的,基於不同人生觀所實現兩種解決方案
悲觀鎖
資料庫終端操作:
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; 提交事務