最近我在MySQL5.7文档https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks中读到了InnoDB锁。我搞混了Next-Key Lock和Gap Lock。在文档中,下一个键锁定记录和它之前的间隙,而间隙锁锁定唯一的间隙?例如:
CREATE TABLE `r` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`k` int(11) DEFAULT NULL,
`u` int(11) DEFAULT NULL,
`v` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_u` (`u`),
KEY `idx_k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 insert into r values (2,2,2,2),(6,6,6,6),(7,7,7,7);
语句1:select * from r where u = 4 for update;
语句1使用唯一索引查找记录不存在,它使用间隙锁,锁定区域u B+tree from (u=2,id=2) to (u=6,id=6)防止插入,但不锁定记录k B+tree (u=2,id=2)和(u=6,id=6)。
语句2:select * from r where k = 6 for update;
语句2使用非唯一索引查找已存在的记录,它使用下一个键锁锁定区域k B+tree from ((k=2,id=2),(k=6,id=6)]和间隙锁锁定区域k B+tree from ((k=6,id=6),(k=7,id=7)),也锁定id =6的簇索引;
所以我的问题是:
1、锁区域((k=2,id=2),(k=6,id=6)]是下一键锁,区域((k=6,id=6),(k=7,id=7))是间隙锁,对吗?
2、对这两种说法的理解正确吗?
请原谅我的英语。
发布于 2020-02-12 22:22:27
我认为你所有的陈述都是对的。
检查答案的另一种方法是检查data_locks表中由innodb执行的锁。
select * from performance_schema.data_locks;您可以检查LockMode列:
https://stackoverflow.com/questions/53929780
复制相似问题