间隙锁和临键锁的锁定范围
文章目录
- 间隙锁和临键锁的锁定范围
- 简介
- 示例
- 临键锁(Next-Key Lock)的锁定范围
- 结论分析
简介
通过一个示例,理解行级锁、间隙锁和临键锁各自的锁定范围。
间隙锁锁定的是范围是一个开区间,临键锁石间隙锁和记录锁的结合,记录锁会锁定相关行的索引,所以记录锁锁定的是一个左开右闭的区间。
示例
CREATE TABLE example ( id INT PRIMARY KEY, value VARCHAR(50) ); INSERT INTO example (id, value) VALUES (5, 'A'), (10, 'B'), (15, 'C');
在上面的表结构和数据下,执行以下事务 SQL:
START TRANSACTION;
-- 对 id 在 10 到 20 之间的记录及其前后的间隙加临键锁
SELECT * FROM example WHERE id BETWEEN 10 AND 20 FOR UPDATE;
通过这个示例来了解一下记录锁、间隙锁和临键锁的加锁锁定范围。
临键锁(Next-Key Lock)的锁定范围
根据 InnoDB 的锁定机制,对于SELECT * FROM example WHERE id BETWEEN 10 AND 20 FOR UPDATE
语句,会应用临键锁。临键锁不仅锁定查询条件匹配的记录,还锁定这些记录前后的间隙。具体锁定范围如下:
- 锁定匹配记录:
- 记录
id = 10
- 记录
id = 15
- 记录
- 锁定前后的间隙:
- 间隙
(5, 10]
:从记录id = 5
之后的间隙开始,直到并包括id = 10
。 - 间隙
(10, 15]
:从记录id = 10
之后的间隙开始,直到并包括id = 15
。 - 间隙
(15, ∞)
:从记录id = 15
之后的间隙开始,到无穷大。
- 间隙
因此,临键锁的具体锁定范围应为:
- 间隙
(5, 10]
:锁定包含id = 10
记录 - 间隙
(10, 15]
:锁定包含id = 15
记录 - 间隙
(15, ∞)
:锁定id > 15
的间隙
结论分析
- 间隙锁:间隙锁确实锁定的是记录之间的间隙,但具体锁定范围为
(5, 10)
、(10, 15)
和(15, ∞)
。 - 临键锁:临键锁不仅锁定了匹配的记录(如
id = 10
和id = 15
),还锁定了前后的间隙。具体锁定范围包括(5, 10]
、(10, 15]
和(15, ∞)
。