您好,登錄后才能下訂單哦!
這篇文章主要介紹了MySQL中InnoDB事務(wù)鎖閱讀鎖信息狀態(tài)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
⒈表結(jié)構(gòu)以及數(shù)據(jù)
⑴locktest2表情況如下:id為主鍵,a為唯一索引
CREATE TABLE `locktest2` (
`id` int(11) NOT NULL,
`a` int(11) NOT NULL,
`b` varchar(30) NOT NULL DEFAULT 'xddd',
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
⑵表中存在如下數(shù)據(jù):
mysql> select * from locktest2;
+----+----+------+
| id | a | b |
+----+----+------+
| 3 | 2 | xddd |
| 9 | 20 | ddd |
| 12 | 13 | ddd |
| 19 | 7 | cccc |
| 20 | 5 | abcd |
| 21 | 4 | fff |
+----+----+------+
⒉構(gòu)造所等待
session1如下:
session2如下(session2處于了等待狀態(tài)):
⒊輸出事務(wù)鎖狀態(tài)信息以及字段注解
TABLE LOCK table `test1`.`locktest2` trx id 4955 lock mode IX
TABLE LOCK:是一個(gè)表鎖
table `test1`.`locktest2`:表鎖的表是test1庫(kù)的locktest2表
trx id 4955:這個(gè)事務(wù)的事務(wù)id(被這個(gè)事務(wù)所更新的行,行上面的DB_TRX_ID字段都是4599,這個(gè)4599主要是MVCC用來(lái)做可見(jiàn)性判斷)
lock mode IX:IX鎖模式,這個(gè)主要是針對(duì)多粒度鎖,在有表鎖時(shí),提前檢測(cè)沖突
RECORD LOCKS space id 40 page no 4 n bits 80 index a of table `test1`.`locktest2` trx id 4955 lock_mode X locks gap before rec insert intention waiting
RECORD LOCKS:記錄鎖
space id 40 page no 4 n bits 80:表空間編號(hào)為40,表空間頁(yè)的編號(hào)為4,用了80位來(lái)表示表示加鎖情況(bitmap,假設(shè)heap no=2的記錄被加鎖,則在bitmap的第一個(gè)元素被置為1,其他的都為0)
index a of table `test1`.`locktest2`:鎖在test1庫(kù)locktest2表的a索引上
lock_mode X locks gap before rec insert intention waiting:鎖模式為L(zhǎng)OCK_X,鎖類(lèi)型為L(zhǎng)OCK_GAP|LOCK_INSERT_INTENTION,這個(gè)鎖處于等待狀態(tài);組合一下這個(gè)鎖,即為L(zhǎng)OCK_X|LOCK_GAP|LOCK_INTENTION|LOCK_WAITING(這些不懂請(qǐng)參考我前面的鎖與鎖模式的文章)
Record lock, heap no 7 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
Record lock:記錄鎖
heap no 7:這條記錄在頁(yè)的中編號(hào)為7
PHYSICAL RECORD: n_fields 2; compact format; info bits 0:物理記錄中有兩個(gè)字段,行格式為compact;記錄信息為未標(biāo)記為刪除
0: len 4; hex 80000014; asc ;;
第一個(gè)字段:長(zhǎng)度4個(gè)字節(jié),16進(jìn)制表示的字段值,為14即十進(jìn)制的20
1: len 4; hex 80000009; asc ;;
第二個(gè)字段:長(zhǎng)度4個(gè)字節(jié),16進(jìn)制表示的字段值,為9即十進(jìn)制的9
注意:上面的兩個(gè)字段組成了二級(jí)索引的記錄,即(20,9),索引字段值為20,主鍵字段為9
RECORD LOCKS space id 40 page no 3 n bits 80 index PRIMARY of table `test1`.`locktest2` trx id 4954 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000009; asc ;;//主鍵列的值為9
1: len 6; hex 000000000f6f; asc o;;//DB_TRX_ID,即4954
2: len 7; hex d200000167011e; asc g ;;//回滾指針rollback ptr
3: len 4; hex 80000014; asc ;;//a列的值
4: len 3; hex 646464; asc ddd;;//b列的值
⒋鎖等待簡(jiǎn)單分析(這里我們主要是看鎖狀態(tài)信息,所以這個(gè)鎖等待簡(jiǎn)單分析下)
⑴session 1通過(guò)索引a查找記錄(where a between 13 and 20),所以會(huì)在對(duì)二級(jí)索引13加上LOCK_X|LOCK_ORDINARY|LOCK_REC,表示鎖住二級(jí)索引(7,13]這個(gè)區(qū)間;對(duì)二級(jí)索引20加上LOCK_X|LOCK_ORDINARY|LOCK_REC,表示鎖住二級(jí)索引(13,20]這個(gè)區(qū)間;對(duì)二級(jí)索引頁(yè)的supremun記錄加上LOCK_X|LOCK_ORDINARY|LOCK_REC,表示鎖住(20,+無(wú)窮大)這個(gè)區(qū)間(至于這個(gè)為什么鎖住supermum這條記錄,因?yàn)檫@是第一條未滿(mǎn)足條件的記錄);注意這里還會(huì)對(duì)找到的具體主鍵記錄(其實(shí)是表數(shù)據(jù)行)也會(huì)加鎖,但這里他對(duì)鎖等待分析不影響。
⑵session insert的唯一鍵a的值為16,這個(gè)插入的范圍在(13,20]當(dāng)中,而這個(gè)范圍被加上了LOCK_X|LOCK_ORDINARY|LOCK_REC鎖,與insert的LOCK_X|LOCK_GAP|LOCK_INSERT_INTENTION沖突,所以insert語(yǔ)句被置為了等待狀態(tài),即LOCK_X|LOCK_GAP|LOCK_INSERT_INTENTION/LOCK_WAITTING(這里沖突不清楚請(qǐng)看我前面的鎖類(lèi)型與鎖模式?jīng)_突矩陣的文章).
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“MySQL中InnoDB事務(wù)鎖閱讀鎖信息狀態(tài)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。