间隙锁可以理解成“锁住两条记录之间的空档”,重点不是锁已有数据,而是阻止别人往这个范围里插入新记录。
它锁的到底是什么
假设索引里已经有 1、5、10 三个值,那么 1 到 5 之间、5 到 10 之间这些还没有数据的位置,就是“间隙”。间隙锁锁住的正是这些空档。
为什么需要间隙锁
它主要用来防止幻读。否则你在事务里按条件查过一次,别人可能马上插入一条刚好命中的新数据,导致你再次查询时结果集突然变了。
它和记录锁有什么区别
记录锁锁的是已经存在的那一行;间隙锁锁的是行与行之间的范围。两者经常一起出现,组合后就形成大家常说的临键锁。
什么时候最容易碰到
在 InnoDB 的可重复读隔离级别下,执行范围查询并配合 for update 或更新语句时,更容易看到间隙锁带来的阻塞现象。
一句话理解
间隙锁不是怕你改旧数据,而是怕你在我当前查询范围里偷偷插入新数据。
正文完



