【发布时间】:2018-12-26 09:04:29
【问题描述】:
最近我阅读了 MySQL5.7 文档中的 InnoDB Locks,https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks。 我对 Next-Key Lock 和 Gap Lock 感到困惑。 在文档中,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从(u=2, id=2)到(u=6, id=6)防止从插入,但不锁定记录k B+tree (u=2, id=2) and (u=6, id=6)。
声明 2:
select * from r where k = 6 for update;
语句2使用非唯一索引搜索存在的记录,它使用next-key lock锁定区域k B+tree from ((k=2, id=2), (k=6, id=6 )] 并且间隙锁从 ((k=6, id=6), (k=7, id=7)) 锁定区域 k B+tree,同时锁定 id = 6 的簇索引;
所以我的问题是:
1、锁定区域((k=2, id=2), (k=6, id=6)]是next-key lock, 区域((k=6, id=6), (k= 7, id=7)) 是间隙锁,对吗?
2,这两种说法的理解对吗?
请原谅我的英语。
【问题讨论】:
标签: mysql