您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關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的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。