间隙锁的分析:
表结构如下:
CREATE TABLE `test_gap` (
`ID` int(11) NOT NULL, -- 主键
`NAME` varchar(255) NOT NULL, -- 非唯一索引
PRIMARY KEY (`ID`),
KEY `NAME` (`NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表中数据如下:
假设UPDATE NAME = 'c' 或者 DELETE NAME = 'c' 会产生间隙锁:
此时会去寻找非唯一索引的间隙锁的上下区间,对应表里数据区间就是(a,e);
1:如果插入的数据,属于(a,e)之间,既b,d,此时无法插入,因为b,d被间隙锁锁定
2:如果插入的数据,不属于(a,e)之间,那么不受间隙锁影响,自由插入
3:如果插入的数据,等于a或者e,此时需要再根据主键来判断锁定范围:
1):如果是a,则取a的最大值ID为50,只要插入的数据ID<50则可以自由插入,ID>50既全部锁定无法插入
2):如果是e,则取e的最小值ID为30,只要插入的数据ID>30则可以自由插入,ID<30既全部锁定无法插入
那么开始模拟死锁情景
执行顺序:1,2,3,4