mysql 间隙锁原理深度详解
MySQL中的间隙锁(Gap Lock)是一种针对InnoDB存储引擎的锁定机制,用于锁定一个范围,但不包括记录本身,主要用于防止幻读。间隙锁是锁定在索引记录之间的间隙上,或者锁定一个范围的开始或结束。间隙锁不会和任何事务ID关联,它是由其他事务无法看到的隐藏锁。
间隙锁的主要目的是为了防止幻读,当事务使用了RR(Repeatable Read)隔离级别时,InnoDB会通过间隙锁来防止其他事务在 gap 中插入数据,从而导致当前事务重新读取时可能看到不一致的数据。
间隙锁的使用场景通常包括:
- 当使用RR隔离级别进行范围查询时。
- 当使用锁定读(SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE)进行查询时。
以下是一个简单的例子,演示了间隙锁的使用:
假设有一个简单的表 t
,其有一个唯一索引 id
:
CREATE TABLE t (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY (id)
) ENGINE=InnoDB;
现在,假设有两个并行的事务:T1 和 T2。
T1 执行:
START TRANSACTION;
SELECT * FROM t WHERE id BETWEEN 1 AND 10 FOR UPDATE;
COMMIT;
在T1事务执行期间,T2无法在间隙11和20插入新的记录,因为T1的间隙锁已经锁定了这个范围。
START TRANSACTION;
INSERT INTO t (id, value) VALUES (15, 'Test'); -- 会被阻塞,直到T1提交
COMMIT;
间隙锁的存在是为了保证数据的一致性,但也可能会对性能造成影响,特别是在经常发生间隙锁冲突的应用程序中。因此,了解和适当管理间隙锁对于有效使用MySQL是重要的。
评论已关闭