MySQL 间隙锁是为了防止幻读而引入的一种锁机制。它会在查询时对查询涉及到的范围进行锁定,以避免其他事务在该范围内插入或删除数据。
下面是一个 MySQL 间隙锁的例子:
假设有一个表 t1,包含两列 id 和 value:
CREATE TABLE t1 (
id INT PRIMARY KEY,
value VARCHAR(255)
);
现在有两个事务 A 和 B,A 在执行如下语句:
BEGIN;
SELECT * FROM t1 WHERE id >= 10 AND id <= 20 FOR UPDATE;
B 在执行如下语句:
BEGIN;
INSERT INTO t1 (id, value) VALUES (15, 'test');
COMMIT;
这时候 B 的插入操作就会被阻塞,因为 A 对 id 范围内的行进行了锁定,而 B 正试图插入一个与 A 查询重叠的行。如果没有间隙锁的话,B 就可以成功地插入数据,导致 A 查询出现幻读。
通过添加间隙锁,MySQL 可以保证 A 和 B 的操作不会互相冲突。A 执行 SELECT 语句时会自动加上间隙锁,包括 id=9 到 id=10 和 id=20 到 MAX(id) 这两个范围。这样就可以防止其他事务插入或删除 id 在这个范围内的行,从而避免幻读的问题。




