最近我在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、对这两种说法的理解是否正确?
请原谅我的英语。
1条答案
按热度按时间pxq42qpu1#
我认为你的说法都是对的。
另一种检查答案的方法是检查datalocks表中innodb执行的锁。
您可以检查lockmode列:
x/s:表示下一个钥匙锁;
x/s,gap:组合表示gap lock end;
x/s,rec\u not\u gap:这个组合表示记录锁定。