RR模式下NEXT-KEYLOCK范圍到底有多大

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)RR模式下NEXT-KEY LOCK范圍到底有多大,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

鎮(zhèn)江網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

我們知道MySQL NEXT-KEY LOCK是用來防止幻讀,在RR模式下就有了用武之地
實(shí)際就是當(dāng)前行鎖+前后的一個(gè)區(qū)間,但是這個(gè)區(qū)間到底有多大?
是簡單的一個(gè)輔助索引列上的閉區(qū)間嗎?
測試全部是在RR模式下RC模式不存在

建立測試表:
CREATE TABLE `test` (
  `a` int(11) NOT NULL DEFAULT '0',
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`a`),
  KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 插入幾行數(shù)據(jù) mysql> insert into test values(10,2);
Query OK, 1 row affected (0.01 sec) mysql> insert into test values(15,2);
Query OK, 1 row affected (0.02 sec) mysql> insert into test values(20,4);
Query OK, 1 row affected (0.01 sec) mysql> insert into test values(25,6);
Query OK, 1 row affected (0.02 sec) mysql> insert into test values(99,8);
Query OK, 1 row affected (0.00 sec) mysql> commit;
Query OK, 0 rows affected (0.00 sec) mysql> select * from test;
+----+------+
| a  | b    |
+----+------+
| 10 |    2 |
| 15 |    2 |
| 20 |    4 |
| 25 |    6 |
| 99 |    8 |
+----+------+
5 rows in set (0.00 sec) 會(huì)話A:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where b=4 for update;
+----+------+
| a  | b    |
+----+------+
| 20 |    4 |
+----+------+
1 row in set (0.00 sec)

會(huì)話B:
mysql> select * from test where b=2 for update;
+----+------+
| a  | b    |
+----+------+
| 10 |    2 |
| 15 |    2 |
+----+------+
2 rows in set (0.00 sec)

mysql> select * from test where b=6 for update;
+----+------+
| a  | b    |
+----+------+
| 25 |    6 |
+----+------+
1 row in set (0.00 sec) 都沒有問題,那顯然這些列都沒加X鎖,那是不是可以簡單的理解鎖定是
一個(gè)2-6的區(qū)間不包含2和6呢?
看下面的語句:
mysql> insert into test values(16,2);
^CCtrl-C -- sending "KILL QUERY 3" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
mysql> insert into test values(16,6);
^CCtrl-C -- sending "KILL QUERY 3" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
均鎖定了

但是
mysql> insert into test values(14,2);
Query OK, 1 row affected (0.21 sec)
mysql> insert into test values(26,6);
Query OK, 1 row affected (0.02 sec)
是可以執(zhí)行的。

這也證明了我們剛才的結(jié)論是不正確的,我們分析一下

| 15 |    2 |
| 20 |    4 |
| 25 |    6 |
這是原始的記錄我們對(duì)4進(jìn)行了for update,為了更小的縮小范圍
實(shí)際上INNODB把鎖的方位定義到了
b列2 a列(15到正無窮) b列4 全部 b列6 a列(負(fù)無窮到25) 
之間全部的范圍,這看起來好像不是一個(gè)連續(xù)的區(qū)間,但是如果理解B+樹索引
同時(shí)INNODB在處理相同的值的時(shí)候按照主鍵升序進(jìn)行排列就出現(xiàn)了一個(gè)連續(xù)的
區(qū)間,我們來畫一下,假設(shè)葉子節(jié)點(diǎn)如下排列,
RR模式下NEXT-KEY LOCK范圍到底有多大

實(shí)際上這樣我們就能看出這樣一個(gè)范圍,如果我們插入的是

 values(16,2)顯然在這個(gè)范圍內(nèi)它應(yīng)該插入在2 15 和4 20 之間,所以鎖定

 values(16,6)顯然也在范圍,他應(yīng)該插入到4 20和6 25 之間,所以鎖定

 values(14,2)顯然不在這個(gè)范圍,他應(yīng)該在2 10 和 2 15之間插入,所以O(shè)K

 values(26,6)在6 25和8 99 之間當(dāng)然也可以。

如果要插入(3,3)顯然不行,因?yàn)槭紫仁前凑誯ey排序的他肯定在這個(gè)范圍內(nèi)。

最后我們得出我們的結(jié)論:

b列2 a列(15到正無窮)

b列4 全部

b列6 a列(負(fù)無窮到25)

這樣一個(gè)范圍的插入全部不允許,當(dāng)然2 15  6 25本身不包含因?yàn)榭梢詅or update.

其實(shí)這樣做也是為了最小化鎖定范圍提高并發(fā),所以輔助索引上的gap lock不僅取決

于輔助索引列還取決于主鍵列的值,但是要注意這個(gè)鎖是在輔助索引上的,而不是
主鍵上。
還有一點(diǎn)需要提醒:
如果鎖定是邊界記錄如上圖的
b=2 for update

b=8 for update
那么鎖定的范圍將變大
b=2 for update鎖定的是 b列負(fù)無窮 到 b列4 a列(負(fù)無窮到20) 
如圖:
這里將虛擬行infimum寫出來代表負(fù)無窮
RR模式下NEXT-KEY LOCK范圍到底有多大
b=8 for update鎖定的是b列 6 a列(25 到正無窮) 到 b列 正無窮
如圖:
這里將supremum虛擬行列出來代表正無窮
RR模式下NEXT-KEY LOCK范圍到底有多大

實(shí)際就是看圖就理解了

最后就是需要驗(yàn)證:

驗(yàn)證從2個(gè)方面

1、對(duì)輔助索引的頁中鏈表進(jìn)行分析,如果在輔助索引頁內(nèi)的鏈表按照首先是KEY排序然后KEY相同的按照PRIMARY KEY排序那么基本就驗(yàn)證了我們的說法
   這個(gè)隨后可以補(bǔ)上

2、源碼查看,源碼過于龐大就是B+樹索引數(shù)據(jù)結(jié)構(gòu)的建立,查找,插入,刪除都非常難看懂,如果要到我們需要的證據(jù)非常困難,以后盡力。

上述就是小編為大家分享的RR模式下NEXT-KEY LOCK范圍到底有多大了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:RR模式下NEXT-KEYLOCK范圍到底有多大
文章源于:http://bm7419.com/article24/pssije.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、Google、定制開發(fā)、用戶體驗(yàn)、面包屑導(dǎo)航

廣告

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

搜索引擎優(yōu)化