next键锁和gap锁有什么区别?

cld4siwp  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(675)

最近我在mysql5.7doc中读到了innodb锁,https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-间隙锁。我不知道下一个钥匙锁和间隙锁。在文档中,下一个键锁锁定记录和它前面的间隙,间隙锁只锁定间隙?例如:
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使用唯一索引搜索记录dose not exist,它使用gap lock,将区域u b+树从(u=2,id=2)锁定到(u=6,id=6)阻止插入,但不锁定记录k b+树(u=2,id=2)和(u=6,id=6)。
声明2: select * from r where k = 6 for update; 语句2使用非唯一索引搜索已有的记录,它使用next key lock从((k=2,id=2),(k=6,id=6)]锁定区域kb+树,gap lock从((k=6,id=6),(k=7,id=7))锁定区域kb+树,还锁定id=6的簇索引;
所以我的问题是:
1,锁区域((k=2,id=2),(k=6,id=6)]是下一个钥匙锁,区域((k=6,id=6),(k=7,id=7))是间隙锁,对吗?
2、对这两种说法的理解是否正确?
请原谅我的英语。

pxq42qpu

pxq42qpu1#

我认为你的说法都是对的。
另一种检查答案的方法是检查datalocks表中innodb执行的锁。

select * from performance_schema.data_locks;

您可以检查lockmode列:
x/s:表示下一个钥匙锁;
x/s,gap:组合表示gap lock end;
x/s,rec\u not\u gap:这个组合表示记录锁定。

相关问题