间隙锁是可重复读级别下才会有的锁,结合MVCC和间隙锁可以解决幻读的问题。我们还是以user举例,假设现在user表有几条记录
| id | Age |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
当我们执行:
`begin;
select * from user where age=20 for update;
begin;
insert into user(age) values(10); #成功
insert into user(age) values(11); #失败
insert into user(age) values(20); #失败
insert into user(age) values(21); #失败
insert into user(age) values(30); #失败<br />只有10可以插入成功,那么因为表的间隙mysql自动帮我们生成了区间(左开右闭)<br />(negative infinity,10],(10,20],(20,30],(30,positive infinity)
`
由于20存在记录,所以(10,20],(20,30]区间都被锁定了无法插入、删除。
如果查询21呢?就会根据21定位到(20,30)的区间(都是开区间)。
需要注意的是唯一索引是不会有间隙索引的。
