MySQL中的间隙锁(Gap Lock)是一种用于防止幻读的锁机制。在MySQL的InnoDB存储引擎中,除了行锁(Record Lock)之外,还有间隙锁和临键锁(Next-Key Lock)。
- 行锁(Record Lock):锁定数据行,防止其他事务修改或删除该行。
- 间隙锁(Gap Lock):锁定索引记录之间的“间隙”,但不锁定索引记录本身。间隙锁的主要目的是防止其他事务在这个范围插入新的记录,从而避免当前事务的查询结果受到幻读的影响。
- 临键锁(Next-Key Lock):是行锁和间隙锁的组合,同时锁定一个数据行和该行之前的间隙。
幻读是指在一个事务中,两次执行相同的查询,由于其他事务的插入操作,第二次查询的结果集可能会包含第一次查询时不存在的行。
间隙锁的作用:
- 当一个事务使用范围查询条件(如
SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE;
)时,为了防止其他事务在这个范围内插入新的记录,InnoDB会在查询的范围外的间隙上加上间隙锁。 - 这样,即使其他事务尝试在这个范围内插入新的记录,也会因为间隙锁的存在而被阻塞,直到持有间隙锁的事务提交或回滚。
注意:间隙锁只在隔离级别为可重复读(REPEATABLE READ)时才会生效。在读取未提交(READ UNCOMMITTED)隔离级别下,间隙锁不会被使用。
间隙锁是InnoDB存储引擎为了解决幻读问题而引入的一种锁机制,它有助于保持事务的一致性和隔离性。