日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql 的独占锁和排它锁_MySQL的排它锁与共享锁

發布時間:2024/9/27 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的排它锁与共享锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。