MYSQL從Recordlock到Next-KeyLocks到GAP_LOCK的示例分析

本篇文章給大家分享的是有關(guān)MySQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、恩平網(wǎng)站維護(hù)、網(wǎng)站推廣。

大多數(shù)人第一次提到鎖,可能認(rèn)為鎖可能是針對(duì)磁盤上的物理的數(shù)據(jù)記錄,實(shí)際上,所有的操作都在內(nèi)存中完成,鎖怎么可能是針對(duì)磁盤上的物理數(shù)據(jù)呢? 

在認(rèn)識(shí)到鎖都是在內(nèi)存中產(chǎn)生的后,鎖是在什么范圍,怎么進(jìn)行的鎖,等等就是進(jìn)一步需要了解的。

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

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

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

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

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

估計(jì)說(shuō)完這句話,more people will be dizziness.

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

用索引值來(lái)表達(dá)的  (負(fù)無(wú)限,10】(10,11】 (11,13】 (13,20】 (20,正無(wú)限)

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

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

我們繼續(xù)上面的那個(gè)10,11,13,20的例子,

下面有三個(gè) session 同時(shí)運(yùn)行

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ù)會(huì)失敗,因?yàn)镚AP LOCK 將(13,20】 這一段的索引值都鎖上了,不允許在這之間進(jìn)行數(shù)據(jù)的插入。

而 Session C 則可以直接插入數(shù)據(jù),因?yàn)榈搅?0時(shí),值是閉合的。

所以在MYSQL的isolation 選擇中,如果你選擇了repeatable read, 就意味著你的MYSQL 更要付出更多的心思在語(yǔ)句的設(shè)計(jì)上,稍不留意,你的MYSQL 就只能不斷了報(bào) BLOCK 的錯(cuò)誤。

我們?cè)谂e一個(gè)例子

 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  都會(huì)失敗。

原因是next-key lock 范圍鎖。

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

我們最后在來(lái)一個(gè)死鎖的案例

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 會(huì)死鎖。

這就是repeatable isolation 下的MYSQL NEXT-KEY LOCK & GAP LOCK 會(huì)遇到的問(wèn)題。所以........  我就不多說(shuō)了。

以上就是MYSQL 從Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:MYSQL從Recordlock到Next-KeyLocks到GAP_LOCK的示例分析
網(wǎng)頁(yè)地址:http://muchs.cn/article38/gesgsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、App設(shè)計(jì)、品牌網(wǎng)站建設(shè)ChatGPT、網(wǎng)站改版、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司