12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-24 19:10:09
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
一、准备数据和问题RR隔离级别CREATETABLE`ty`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`int(11)DEFAULTNULL,`b`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`idxa`(`a`))ENGINE=
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
RR隔离级别
CREATETABLE`ty`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`int(11)DEFAULTNULL,`b`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`idxa`(`a`))ENGINE=InnoDBAUTO_INCREMENT=8DEFAULTCHARSET=utf8mb4insertintoty(a,b)values(2,3),(5,4),(6,7);
问:
image.png
这种情况会产生死锁,如果将
insert into ty(a,b) values(2,10);
改为:
insert into ty(a,b) values(5,10);
则不会产生死锁为什么?
二、初始化数据画图本死锁的堵塞主要集中在二级索引中,我们将二级索KEYidxa
(a
)和主键的数据按照Innodb引擎存储的方式大概排列一下则如图:
image.png
三、T2 步骤1T2 步骤1:delete from ty where a=5;
-----TRXNO:334719LOCKSTRUCT(1)(Addbygaopeng)RECORDLOCKSspaceid653pageno4nbits72indexidxaoftable`test`.`ty`trxid334719lock_modeX(LOCK_X)locksgapandrec(LOCK_ORDINARY[next_key_lock])Recordlock,heapno3PHYSICALRECORD:n_fields2;compactformat;infobits320:len4;hex80000005;asc;;1:len4;hex80000009;asc;;-----TRXNO:334719LOCKSTRUCT(1)(Addbygaopeng)RECORDLOCKSspaceid653pageno3nbits72indexPRIMARYoftable`test`.`ty`trxid334719lock_modeX(LOCK_X)locksrecbutnotgap(LOCK_REC_NOT_GAP)Recordlock,heapno3PHYSICALRECORD:n_fields5;compactformat;infobits320:len4;hex80000009;asc;;1:len6;hex000000051b7f;asc;;2:len7;hex760000082b13fd;ascv+;;3:len4;hex80000005;asc;;4:len4;hex80000004;asc;;-----TRXNO:334719LOCKSTRUCT(1)(Addbygaopeng)RECORDLOCKSspaceid653pageno4nbits72indexidxaoftable`test`.`ty`trxid334719lock_modeX(LOCK_X)locksgapbeforerec(LOCK_GAP)Recordlock,heapno4PHYSICALRECORD:n_fields2;compactformat;infobits00:len4;hex80000006;asc;;1:len4;hex8000000a;asc;;
根据这个记录我们可以画图如下,红色部分为锁定的部分箭头为gap lock:
image.png
四、T1 步骤2T2 步骤1:delete from ty where a=5; 堵塞
-----TRXNO:334724LOCKSTRUCT(1)(Addbygaopeng)RECORDLOCKSspaceid653pageno4nbits72indexidxaoftable`test`.`ty`trxid334724lock_modeX(LOCK_X)locksgapandrec(LOCK_ORDINARY[next_key_lock])waiting(LOCK_WAIT)Recordlock,heapno3PHYSICALRECORD:n_fields2;compactformat;infobits320:len4;hex80000005;asc;;1:len4;hex80000009;asc;;
根据这个记录我们可以画图如下,黄色部分为事务T1准备上锁但是被堵塞的部分,包含黄色部分和红色部分的记录说明它既被T2锁定了并且T1拿不到这条记录的锁,它实际上就是一个next key lock的堵塞:
image.png
五、T2步骤3insert into ty(a,b) values(2,10);
则发生死锁,实际上这一条记录记录在二级索引的值为(2,11),11是主键的值,则画图如下:
image.png
这种情况下则T2也被堵塞,因为这个区域T1也处于堵塞下,则发生死锁。死锁记录如下:
***(2)WAITINGFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid653pageno4nbits72indexidxaoftable`test`.`ty`trxid334712lock_modeX(LOCK_X)locksgapbeforerec(LOCK_GAP)insertintention(LOCK_INSERT_INTENTION)waiting(LOCK_WAIT)Recordlock,heapno3PHYSICALRECORD:n_fields2;compactformat;infobits320:len4;hex80000005;asc;;1:len4;hex80000009;asc;;
及插入印象锁堵塞
insert into ty(a,b) values(5,10);
不会发生死锁,,实际上这一条记录记录在二级索引的值为(5,11),11是主键的值,则画图如下:
image.png
如果是这种情况,不会发生死锁,我们可以看到对于二级索引而言这个区域没有其他事物堵塞,只是T2最开始获取过,本事务再次获取不会有问题。
六、总结本案例实际上就是看最后触发死锁的插入操作插入的记录到底落在二级索引的哪个区域。
作者微信:
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19