原创:全文带入了大量自我认知和理解,可能错误,因为水平有限,但是代表我努力分析过。
一、问题提出
问题是由姜大师提出的、问题如下:
表:
Mysql> show create table c \G
*************************** 1. row ***************************
Table: c
Create Table: CREATE TABLE `c` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `b` (`b`)
) ENGINE=InnoDB
1 row in set (0.01 sec)
开启两个会话不断的执行
replace into c values(NULL,1);
会触发死
锁。问死锁触发的原因。
我使用的环境:
mysql 5.7.14 debug版本、隔离级别RR、自动提交,很显然这里的c表中的可以select出来的记录始终是1条
只是a列不断的增大,但是这里实际存储空间确不止1条,因为从heap no来看二级
索引中,heap no 已经到了
7,也就是有至少7(7-1)条记录,只是其他记录标记为del并且被purge
线程放到了page free_list中。
二、准备工作和使用方法
1、稍微修改了
源码关于锁的打印部分,我们知道每个事物下显示锁内存结构lock
struct会连接成一个
链表,只要按照顺序打印出内存lock struct就打印出了
所有关于这个事物显示锁全部信息和加锁顺序如下:
--结束END--
本文标题: MYSQL INNODB replace into 死锁 及 next key lock 浅析
本文链接: https://lsjlt.com/news/45956.html(转载时请注明来源链接)
有问题或投稿请发送至:
邮箱/279061341@qq.com QQ/279061341
0