间隙锁:Gap Locks, 间隙锁锁住的是索引记录间的空隙,是为了解决幻读问题被引入的。有一点需要注意,间隙锁和间隙锁本身之间并不冲突,仅仅和插入这个操作发生冲突。可重复读且在普通索引才会存在,唯一索引和主键索引是没有间隙锁。
    要禁止间隙锁的话,可以把隔离级别降为读已提交,或者开启参数innodb_locks_unsafe_for_binlog。

    间隙锁产生情况:
    image.png

    • 当我们当前读 读取上表中C=6的数据时,由于没有C=6这条数据,会将(5,10]的区间锁定,这就是间隙锁。间隙锁只对insert有影响。
    • 当我们当前读 读取上表中C=10的数据时,不但会对C=6这行加行锁,还会加上(5,15]的间隙锁。

    试想一下如果没有间隙锁会产生什么影响 ?
    如果没有间隙锁存在的话,如果这时另一个事务再次插入一条C=10的记录,这时就会存在两条记录,也就是幻读,因此是为了解决幻读问题被引入的。