本篇文章給大家分享的是有關(guān)MySQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、恩平網(wǎng)站維護、網(wǎng)站推廣。
大多數(shù)人第一次提到鎖,可能認為鎖可能是針對磁盤上的物理的數(shù)據(jù)記錄,實際上,所有的操作都在內(nèi)存中完成,鎖怎么可能是針對磁盤上的物理數(shù)據(jù)呢?
在認識到鎖都是在內(nèi)存中產(chǎn)生的后,鎖是在什么范圍,怎么進行的鎖,等等就是進一步需要了解的。
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才存在。
我們繼續(xù)上面的那個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);
則結(jié)果 session B 插入數(shù)據(jù)會失敗,因為GAP LOCK 將(13,20】 這一段的索引值都鎖上了,不允許在這之間進行數(shù)據(jù)的插入。
而 Session C 則可以直接插入數(shù)據(jù),因為到了20時,值是閉合的。
所以在MYSQL的isolation 選擇中,如果你選擇了repeatable read, 就意味著你的MYSQL 更要付出更多的心思在語句的設(shè)計上,稍不留意,你的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);
這里的結(jié)果是 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的示例分析,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:MYSQL從Recordlock到Next-KeyLocks到GAP_LOCK的示例分析
網(wǎng)頁地址:http://chinadenli.net/article38/gesgsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、App設(shè)計、品牌網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站改版、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)