MySQL什么情况下会加间隙锁?
目录
一、使用范围条件查询
二、唯一索引的范围查询
三、普通索引的查询
四、间隙锁的锁定规则
五、间隙锁的影响
间隙锁(Gap Lock)是MySQL中的一种锁机制,主要用于防止幻读现象。在MySQL的InnoDB存储引擎中,当事务隔离级别设置为可重复读(Repeatable Read)时,间隙锁可能会被触发。以下是一些具体情况下会加间隙锁的情形:
一、使用范围条件查询
当执行SELECT ... FOR UPDATE
、UPDATE
或DELETE
语句时,如果查询条件使用了范围条件(如>
、<
、BETWEEN
等),并且这些条件涉及到了索引(普通索引或唯一索引的部分列),那么InnoDB会对符合条件的已有数据记录的索引项加锁,同时还会对键值在条件范围内但并不存在的记录(即“间隙”)加锁。
例如,执行以下语句:
SELECT * FROM employees WHERE id BETWEEN 10 AND 20 FOR UPDATE;
如果id
列上存在索引,那么InnoDB不仅会对id
值为10到20的记录加锁,还会对id
值大于10且小于20的间隙加锁,以防止其他事务在这些间隙中插入新的记录。