91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL:Innodb 一個死鎖案例

發布時間:2020-08-08 21:13:42 來源:ITPUB博客 閱讀:168 作者:gaopengtttt 欄目:MySQL數據庫

一、準備數據和問題

RR隔離級別

CREATE TABLE `ty` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idxa` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4
insert into ty(a,b) values(2,3),(5,4),(6,7);

問:


MySQL:Innodb 一個死鎖案例

image.png

這種情況會產生死鎖,如果將
insert into ty(a,b) values(2,10);
改為:
insert into ty(a,b) values(5,10);

則不會產生死鎖為什么?

二、初始化數據畫圖

本死鎖的堵塞主要集中在二級索引中,我們將二級索KEY  idxa  ( a )和主鍵的數據按照Innodb引擎存儲的方式大概排列一下則如圖:

MySQL:Innodb 一個死鎖案例

image.png


三、T2 步驟1

T2 步驟1:delete from ty where a=5;

-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks gap and rec(LOCK_ORDINARY[next_key_lock])
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;
-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 3 n bits 72 index PRIMARY of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 4; hex 80000009; asc     ;; 1: len 6; hex 000000051b7f; asc       ;; 2: len 7; hex 760000082b13fd; asc v   +  ;; 3: len 4; hex 80000005; asc     ;; 4: len 4; hex 80000004; asc     ;;
-----TRX NO:334719 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334719 lock_mode X(LOCK_X) locks gap before rec(LOCK_GAP)
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000006; asc     ;; 1: len 4; hex 8000000a; asc     ;;

根據這個記錄我們可以畫圖如下,紅色部分為鎖定的部分箭頭為gap lock:

MySQL:Innodb 一個死鎖案例

image.png

四、T1 步驟2

T2 步驟1:delete from ty where a=5; 堵塞

-----TRX NO:334724 LOCK STRUCT(1)(Add by gaopeng)
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334724 lock_mode X(LOCK_X) locks gap and rec(LOCK_ORDINARY[next_key_lock]) waiting(LOCK_WAIT)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;

根據這個記錄我們可以畫圖如下,黃色部分為事務T1準備上鎖但是被堵塞的部分,包含黃色部分和紅色部分的記錄說明它既被T2鎖定了并且T1拿不到這條記錄的鎖,它實際上就是一個next key lock的堵塞:

MySQL:Innodb 一個死鎖案例

image.png

五、T2步驟3

這一步如果是:

insert into ty(a,b) values(2,10);
則發生死鎖,實際上這一條記錄記錄在二級索引的值為(2,11),11是主鍵的值,則畫圖如下:


MySQL:Innodb 一個死鎖案例

image.png

這種情況下則T2也被堵塞,因為這個區域T1也處于堵塞下,則發生死鎖。死鎖記錄如下:

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 653 page no 4 n bits 72 index idxa of table `test`.`ty` trx id 334712 lock_mode X(LOCK_X) locks gap before rec(LOCK_GAP) insert intention(LOCK_INSERT_INTENTION) waiting(LOCK_WAIT)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000005; asc     ;; 1: len 4; hex 80000009; asc     ;;

及插入印象鎖堵塞

這一步如果是:

insert into ty(a,b) values(5,10);
不會發生死鎖,,實際上這一條記錄記錄在二級索引的值為(5,11),11是主鍵的值,則畫圖如下:

MySQL:Innodb 一個死鎖案例

image.png

如果是這種情況,不會發生死鎖,我們可以看到對于二級索引而言這個區域沒有其他事物堵塞,只是T2最開始獲取過,本事務再次獲取不會有問題。

六、總結

本案例實際上就是看最后觸發死鎖的插入操作插入的記錄到底落在二級索引的哪個區域。

作者微信: MySQL:Innodb 一個死鎖案例


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹东市| 凤山县| 瓮安县| 福泉市| 南充市| 历史| 永福县| 嘉荫县| 凤山县| 寿光市| 贺州市| 含山县| 黄平县| 冷水江市| 托克托县| 临桂县| 景谷| 资兴市| 吉木萨尔县| 株洲市| 历史| 文成县| 澄城县| 香港| 尉氏县| 重庆市| 华池县| 万州区| 略阳县| 阜康市| 自治县| 蒙山县| 淅川县| 浏阳市| 托克托县| 眉山市| 溧阳市| 深州市| 勐海县| 永安市| 彰化县|