中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析

發布時間:2021-10-25 10:35:15 來源:億速云 閱讀:136 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關MYSQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

大多數人第一次提到鎖,可能認為鎖可能是針對磁盤上的物理的數據記錄,實際上,所有的操作都在內存中完成,鎖怎么可能是針對磁盤上的物理數據呢? 

在認識到鎖都是在內存中產生的后,鎖是在什么范圍,怎么進行的鎖,等等就是進一步需要了解的。

MySQL 中有以下幾種鎖, Record lock, Gap lock, Next-key lock.

Record lock 是基于索引記錄的,也就是他上鎖的目標不是記錄本身而是索引。那有人就提出異議了,我不建索引,我沒有主鍵,我沒有聚簇索引,你奈我何。

你怎么枷鎖我,實際上MYSQL的在你不做任何以上的工作時,MYSQL 會無奈的給你一個,A hidden Clustered index, (所以,建MYSQL 不自己建立聚簇索引,屬于對MYSQL 耍流氓的行為) ,所以我看見MYSQL不建立主鍵,并且用UUID的行為我對此是 “極度的遺憾”。

Next-key lock 這個東西默認是在你MYSQL 在 REPEATABLE READ 模式下,防止你幻讀的。具體Next-key lock 使用對INDEX 行鎖進行GAY LOCKING. 

那為什么要特意搞清楚 NEXT-KEY LOCK ,原文檔有這樣一句話,他說一個 next-key lock 就是一個索引記錄鎖加上一個GAP 鎖, 如果一個session擁有了 S or  X 鎖(這里我們先不考慮 IX IS),其他的Session 將不能插入一個新的INDEX RECORD 在間隙鎖INDEX 記錄之前的位置。

估計說完這句話,more people will be dizziness.

舉個例子,我們有以下索引值 id 10,11,13,20

用索引值來表達的  (負無限,10】(10,11】 (11,13】 (13,20】 (20,正無限)

官方文檔下面就跟著一句話,NEXT-KEY LOCK 將鎖定索引最大值的間隙,In effect, this next-key lock locks only the gap following the        largest index value.  這意味這什么,請打開你的腦洞,這樣的操作會對插入有什么影響。

Gap lock  首先 Gap lock只存在于 repeatable read isolation level,在這個level 里面Gap lock才存在。

我們繼續上面的那個10,11,13,20的例子,

下面有三個 session 同時運行

Session A 

update table set m=m+3 where id =14;

Session B

insert into table (id) values (16);

Session C

insert into table (id) values (21);

則結果 session B 插入數據會失敗,因為GAP LOCK 將(13,20】 這一段的索引值都鎖上了,不允許在這之間進行數據的插入。

而 Session C 則可以直接插入數據,因為到了20時,值是閉合的。

所以在MYSQL的isolation 選擇中,如果你選擇了repeatable read, 就意味著你的MYSQL 更要付出更多的心思在語句的設計上,稍不留意,你的MYSQL 就只能不斷了報 BLOCK 的錯誤。

我們在舉一個例子

 Session A  

select * from table where id > 10 and id < 20 for update;

Session B

 Insert into table (id) varlues (14);

Session C

 insert into table (id) values (21);

這里的結果是  Session B and Session C  都會失敗。

原因是next-key lock 范圍鎖。

使用 repeatable isolation 的MYSQL 會遇到更多的鎖和BLOCK的問題,所以這里建議,MYSQL 不要使用 repeatable isolation ,同時唯一索引在MYSQL 中的性能其實也還值得深究,(其實有些大表在處理唯一索引的時候也是如履薄冰,有坑)

我們最后在來一個死鎖的案例

session A 

begin

select id from table where id = 20 in share mode; (+S)

insert into table (id) values (15)

end

session B

update table set column = column +1 where id = 20;

這樣直接session b 會死鎖。

這就是repeatable isolation 下的MYSQL NEXT-KEY LOCK & GAP LOCK 會遇到的問題。所以........  我就不多說了。

以上就是MYSQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昔阳县| 古田县| 西城区| 招远市| 巴彦淖尔市| 龙岩市| 盐边县| 剑阁县| 嘉义市| 乌兰察布市| 阳西县| 东兰县| 合作市| 航空| 包头市| 徐闻县| 安福县| 泰和县| 临清市| 平阳县| 灵寿县| 栾城县| 南江县| 浮梁县| 临泉县| 专栏| 新蔡县| 枣强县| 慈溪市| 玛沁县| 榆树市| 滕州市| 遂宁市| 白水县| 铜川市| 寿宁县| 滨州市| 海安县| 葫芦岛市| 深泽县| 灵寿县|