最近我在MySQL5.7文档中读到了InnoDB锁。我搞混了Next-Key Lock和Gap Lock。在文档中,下一个键锁定记录和它之前的间隙,而间隙锁锁定唯一的间隙?values (2,2,2,2),(6,6,6,6),(7,7,7,7);语句1使用唯一索引查找记录不存在,它使用间隙锁语句2:select * from r where k = 6 for update;
语句
在下面的innodb锁日志片段中,我有3个事务都在等待TABLE_C上的锁能够插入行。由于某些原因,它们中的任何一个都无法获得锁,因此所有查询都超时,事务被回滚。:23:40 QA mysqld: TOO MANY LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS
但是,我看不到任何其他事务持有该表的锁,所以我不知道是什么阻止了任何事务获得锁。除了另一个事务之外,是否还有其他事务可以阻止锁被获取?
我正在使用MySQL InnoDB表,并试图了解在索引范围扫描情况下某些行级锁定的原因。我发现,根据所使用索引的唯一性,可能会锁定额外的索引记录(超出范围)。参见下面的示例(在8.0.18版本中验证)。 a INT NOT NULL, c CHAR(1) NOT NULL, UNIQUE KEY (b)
INSERT INTO foo VALUES (1,1,'A'), (3,3,'B'), (5,5,&