MySQL中的间隙锁(Gap Lock)是一种用于防止幻读的锁机制。在MySQL的InnoDB存储引擎中,除了行锁(Record Lock)之外,还有间隙锁和临键锁(Next-Key Lock)。

  1. 行锁(Record Lock):锁定数据行,防止其他事务修改或删除该行。
  2. 间隙锁(Gap Lock):锁定索引记录之间的“间隙”,但不锁定索引记录本身。间隙锁的主要目的是防止其他事务在这个范围插入新的记录,从而避免当前事务的查询结果受到幻读的影响。
  3. 临键锁(Next-Key Lock):是行锁和间隙锁的组合,同时锁定一个数据行和该行之前的间隙。

幻读是指在一个事务中,两次执行相同的查询,由于其他事务的插入操作,第二次查询的结果集可能会包含第一次查询时不存在的行。

间隙锁的作用

  • 当一个事务使用范围查询条件(如SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE;)时,为了防止其他事务在这个范围内插入新的记录,InnoDB会在查询的范围外的间隙上加上间隙锁。
  • 这样,即使其他事务尝试在这个范围内插入新的记录,也会因为间隙锁的存在而被阻塞,直到持有间隙锁的事务提交或回滚。

注意:间隙锁只在隔离级别为可重复读(REPEATABLE READ)时才会生效。在读取未提交(READ UNCOMMITTED)隔离级别下,间隙锁不会被使用。

间隙锁是InnoDB存储引擎为了解决幻读问题而引入的一种锁机制,它有助于保持事务的一致性和隔离性。