真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

我們知道MySQL NEXT-KEY LOCK是用來防止幻讀,在RR模式下就有了用武之地
實際就是當前行鎖+前后的一個區(qū)間,但是這個區(qū)間到底有多大?
是簡單的一個輔助索引列上的閉區(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) 會話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)

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

實際上這樣我們就能看出這樣一個范圍,如果我們插入的是

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

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

 values(14,2)顯然不在這個范圍,他應該在2 10 和 2 15之間插入,所以OK

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

如果要插入(3,3)顯然不行,因為首先是按照key排序的他肯定在這個范圍內(nèi)。

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

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

b列4 全部

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

這樣一個范圍的插入全部不允許,當然2 15  6 25本身不包含因為可以for update.

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

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

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

實際就是看圖就理解了

最后就是需要驗證:

驗證從2個方面

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

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

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


新聞名稱:RR模式下NEXT-KEYLOCK范圍到底有多大
標題來源:http://weahome.cn/article/pssije.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部