是什么
- 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。
- 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。
- 幻读在“当前读”下才会出现。
- 幻读仅专指“新插入的行”。
解决办法
引入间隙锁解决了幻读的问题,跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。
间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。
存在的问题
间隙锁和 next-key lock 的引入,帮我们解决了幻读的问题,但同时也带来了一些“困扰”。
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `c` (`c`)
) ENGINE=InnoDB;
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);
SESSION A 锁住的是(5,10),SESSION B锁住的也是(5,10),所以SESSION A和SESSION B 都阻塞了。
间隙锁的引入导致了同样的语句锁住了更大的范围。
注意
- 间隙锁在可重复度隔离级别下才生效