MySQL中的间隙锁(Gap Lock)是一种特殊的行锁,用于解决并发操作下的幻读问题。它可以锁定一个范围而不是单独的行,以避免其他事务插入新数据导致范围内存在未被检索到的数据。
举个例子,假设有如下表结构:
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(50));
现在执行如下语句:
SELECT * FROM t WHERE id > 10 AND id < 20 FOR UPDATE;
这时候就会出现间隙锁。因为该查询语句没有将所有满足条件的行都查出来,只查询了 id 大于10小于20 的数据,如果其他事务插入了 id 等于15的数据,则原本不存在的15也会变成可见的,而这时候加上FOR UPDATE语句后就会阻塞其他事务对 15 行进行修改或者插入等操作。
需要注意以下几点:
MySQL默认情况下不启用间隙锁机制,需手动开启。
只有使用范围查询(比如WHERE id > 10 AND id < 20)才会出现间隙锁。
不同存储引擎之间对间隙锁支持程度不同。InnoDB引擎完全支持间隙锁机制,但是MyISAM引擎则不支持。
间隙锁可能会导致死锁问题,需要谨慎使用。




