mysql 的独占锁和排它锁_MySQL的排它锁与共享锁
博主最近在復習 MySQL 和 Redis 的知識。順便就記錄一下這個 MySQL 排它鎖和共享鎖。
本文以下內容基于數據表(test 表):+----+-------+
|?id?|?name??|
+----+-------+
|?1??|?111???|
+----+-------+
|?2??|?222???|
+----+-------+
共享鎖
共享鎖也叫讀鎖,就是在讀取數據的時候加上共享鎖,如果不提交事務就會一直鎖行阻塞。
執行 SQL :BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?LOCK?IN?SHARE?MODE;
正常返回了數據記錄:
此時打開另外一個數據庫管理軟件(新進程)訪問同一個數據庫繼續執行排它鎖 SQL:BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?FOR?UPDATE;
因為剛才執行的 SQL 加了共享鎖,所以此時新進程使用排它鎖查詢同一條數據會因為阻塞而超時。
而如果使用正常的查詢或者共享鎖繼續查詢:SELECT?`id`,`name`?FROM?test?WHERE?id?=?1;
#?或者:
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?LOCK?IN?SHARE?MODE;
是不會被阻塞的,可以正常返回數據。
排它鎖
排它鎖是獨占鎖,執行之后使用共享鎖查詢被排它鎖鎖住的數據記錄也無法查詢。
例如 A 進程中查詢:BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?FOR?UPDATE;
在 B 進程中執行:BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?LOCK?IN?SHARE?MODE;
或者執行:BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?FOR?UPDATE;
都是無法查詢到結果,直到 A 進程提交事務后才會獲取到結果。
自帶排它鎖
其實 innoDB 執行 UPDATE 是帶有排它鎖的,所以在事務中執行 UPDATE 但是不提交事務的時候,其他進程使用排它鎖或者共享鎖是無法查詢的。
A 進程執行:BEGIN;
UPDATE?test?SET?NAME?=?333?WHERE?id?=?1;
B 進程執行:BEGIN;
SELECT?`id`,`name`?FROM?test?WHERE?id?=?1?FOR?UPDATE;
COMMIT;
就會遇到阻塞而無法查詢數據。
樂觀鎖
上面寫的共享鎖和排它鎖其實都是屬于悲觀鎖,而樂觀鎖其實更適合高并發。
假如 test 表中含有的字段和數據:+----+-------+---------+
|?id?|?stock?|?version?|
+----+-------+---------+
|?1??|?100???|?1???????|
|?2??|?200???|?2???????|
+----+-------+---------+
查詢數據:SELECT?`id`,`name`?FROM?test?WHERE?id?=?1
返回的結果:+----+-------+---------+
|?id?|?stock?|?version?|
+----+-------+---------+
|?1??|?100???|?1???????|
+----+-------+---------+
此時需要減少該記錄的庫存,使用樂觀鎖可以這樣執行:UPDATE?test?SET?stock?=?stock?-?1?WHERE?id?=?1?AND?stock?>?0?AND?version?=?1?AND?stock?=?100;
因為在 where 條件中加入了查詢到的結果返回的參數,并且如果庫存 stock 為 0 的時候是無法執行成功的,所以一般情況下這樣執行之后超賣就不會出現。
共享鎖和排它鎖的區別
共享鎖是可以大家一起讀的,就是在 A 進程使用共享鎖查詢了數據,B 進行也可以繼續查詢,但是如果 B 進程進行修改也會進行阻塞。 如果此時新的進程使用排它鎖查詢被共享鎖的數據是會被阻塞的。
排它鎖是獨占鎖,當查詢的時候 SELECT ... FOR UPDATE 其他進程就不能使用排它鎖或者共享鎖進行查詢該數據了(增刪改查都無法進行)。
注意
使用鎖一定要將數據引擎設置為 innoDB, 因為 Myisam 引擎不支持事務。
以上內容是博主對鎖的個人理解,如有錯誤可以評論指正。
總結
以上是生活随笔為你收集整理的mysql 的独占锁和排它锁_MySQL的排它锁与共享锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: amd为什么还用针脚_为什么intel处
- 下一篇: 朝阳科技有限公司做什么的 带你了解