MySQL InnoDB支持三種行鎖定方式:

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設服務10余年為成都木托盤小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設營銷網(wǎng)站建設商城網(wǎng)站建設手機網(wǎng)站建設小程序網(wǎng)站建設網(wǎng)站改版,從內(nèi)容策劃、視覺設計、底層架構、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設服務。
行鎖(Record Lock):鎖直接加在索引記錄上面。
間隙鎖(Gap Lock):鎖加在不存在的空閑空間,可以是兩個索引記錄之間,也可能是第一個索引記錄之前或最后一個索引之后的空間。
Next-Key Lock:行鎖與間隙鎖組合起來用就叫做Next-Key Lock。
默認情況下,InnoDB工作在可重復讀隔離級別下,并且以Next-Key Lock的方式對數(shù)據(jù)行進行加鎖,這樣可以有效防止幻讀的發(fā)生。Next-Key Lock是行鎖與間隙鎖的組合,這樣,當InnoDB掃描索引記錄的時候,會首先對選中的索引記錄加上行鎖(Record Lock),再對索引記錄兩邊的間隙(向左掃描掃到第一個比給定參數(shù)小的值, 向右掃描掃描到第一個比給定參數(shù)大的值, 然后以此為界,構建一個區(qū)間)加上間隙鎖(Gap Lock)。如果一個間隙被事務T1加了鎖,其它事務是不能在這個間隙插入記錄的。
舉個例子:
表task_queue
Id taskId
1 2
3 9
10 20
40 41
開啟一個會話: session 1
sql> set autocommit=0;
##
取消自動提交
sql> delete from task_queue where taskId = 20;
sql> insert into task_queue values(20, 20);
在開啟一個會話: session 2
sql> set autocommit=0;
##
取消自動提交
sql> delete from task_queue where taskId = 25;
sql> insert into task_queue values(30, 25);
在沒有并發(fā),或是極少并發(fā)的情況下, 這樣會可能會正常執(zhí)行,在Mysql中, 事務最終都是穿行執(zhí)行, 但是在高并發(fā)的情況下, 執(zhí)行的順序就極有可能發(fā)生改變, 變成下面這個樣子:
sql> delete from task_queue where taskId = 20;
sql> delete from task_queue where taskId = 25;
sql> insert into task_queue values(20, 20);
sql> insert into task_queue values(30, 25);
這個時候最后一條語句:insert into task_queue values(30, 25); 執(zhí)行時就會爆出死鎖錯誤。因為刪除taskId = 20這條記錄的時候,20 -- 41 都被鎖住了, 他們都取得了這一個數(shù)據(jù)段的共享鎖, 所以在獲取這個數(shù)據(jù)段的排它鎖時出現(xiàn)死鎖。
間隙鎖在InnoDB的唯一作用就是防止其它事務的插入操作,以此來達到防止幻讀的發(fā)生,所以間隙鎖不分什么共享鎖與排它鎖。另外,在上面的例子中,我們選擇的是一個普通(非唯一)索引字段來測試的,這不是隨便選的,因為如果InnoDB掃描的是一個主鍵、或是一個唯一索引的話,那InnoDB只會采用行鎖方式來加鎖,而不會使用Next-Key Lock的方式,也就是說不會對索引之間的間隙加鎖,仔細想想的話,這個并不難理解,大家也可以自己測試一下。
要禁止間隙鎖的話,可以把隔離級別降為讀已提交,或者開啟參數(shù)innodb_locks_unsafe_for_binlog。
本文標題:mysql間隙鎖GapLock
文章來源:http://chinadenli.net/article40/goipeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站改版、虛擬主機、外貿(mào)建站、小程序開發(fā)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)