间隙锁(Gap Lock)是MySQL中的一种锁机制,用于防止并发事务在范围查询中插入新记录或者锁定已存在的记录。
当一个事务执行范围查询时,MySQL会为查询结果集中的每个记录都加上间隙锁,即锁定了记录之间的间隙(Gap)。这样可以防止其他事务在这个范围内插入新记录,从而保持查询结果的一致性。间隙锁的目的是为了避免幻读(Phantom Read)的问题。
举个例子,假设有一个表中的记录按照某个列的升序排列,事务A执行以下查询:
sqlCopy code
SELECT * FROM table WHERE col BETWEEN 10 AND 20 FOR UPDATE;
MySQL会为查询结果中的记录加上间隙锁,即锁定了10到20之间的间隙。这样,其他事务在这个范围内插入新记录时会被阻塞,直到事务A提交或者回滚。
需要注意的是,间隙锁只在使用索引的情况下生效。如果查询条件没有使用索引,MySQL不会使用间隙锁。
间隙锁的使用可以通过设置事务的隔离级别来控制。在Read Committed隔离级别下,MySQL默认使用间隙锁。在Repeatable Read和Serializable隔离级别下,MySQL会使用更严格的锁机制,包括间隙锁和Next-Key锁,用于防止幻读的问题。
使用间隙锁可以确保查询结果的一致性,但也可能对并发性能产生一定的影响,因为其他事务在相同的间隙内会被阻塞。因此,在设计数据库架构和选择事务隔离级别时,需要综合考虑数据一致性和并发性能的平衡。