回答
间隙锁(Gap Lock)是 InnoDB 存储引擎中的一种锁机制,用以防止幻读(Phantom Read)发生,支持数据库事务的可重复读。
间隙锁锁定的不是具体的行记录,而是索引记录之间的范围。间隙锁的目的是防止其他事务在锁定范围内插入新的数据。
间隙锁应用场景
- 建表及初始化语句
CREATE TABLE `t_user` (
`id` int NOT NULL,
`age` int NOT NULL,
`name` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`)
) ENGINE=InnoDB;
insert into t_user(id,age,name) values (10, 10, 'aa');
insert into t_user(id,age,name) values (11, 20, 'ab');
insert into t_user(id,age,name) values (12, 22, 'ab');
insert into t_user(id,age,name) values (30, 30, 'ac');
- 范围查询与一致性读取
如上,事务 A 会在索引idx_age
上的 (0,10]、(10,20] 以及 (20,22] 范围加上间隙锁,所以当事务 A 尚未提交时,事务B、C、D插入数据时会被阻塞以保证事务 A 的可重复读,而事务 E 则可以顺利插入。
- 唯一索引
修改表t_user
的索引idx_age
为唯一索引,那么 InnoDB 会在插入前对相应的间隙加锁以检查唯一性