MySQL中的间隙锁(Gap Lock)是一种用于防止幻读(Phantom Read)现象的锁机制,主要在可重复读(Repeatable Read)和串行化(Serializable)隔离级别下使用。间隙锁的作用范围是索引记录之间的间隙,而不是记录本身。
间隙锁锁定的是两个索引记录之间的间隙,而不是记录本身。它可以防止其他事务在这个间隙中插入新的记录,从而避免幻读的发生。
间隙锁主要有两种类型:
间隙锁主要应用于以下场景:
原因:当多个事务互相等待对方释放锁时,可能会导致死锁。
解决方法:
innodb_lock_wait_timeout
参数来控制等待时间。原因:间隙锁会锁定索引记录之间的间隙,可能会影响并发性能。
解决方法:
假设有一个表users
,结构如下:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
在可重复读隔离级别下,执行以下查询:
START TRANSACTION;
SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE;
-- 其他事务在此区间插入新记录会被阻塞
COMMIT;
在这个例子中,FOR UPDATE
会锁定查询范围内的记录以及它们之间的间隙,防止其他事务插入新记录。
领取专属 10元无门槛券
手把手带您无忧上云