MVCC和LBCC
Innodb引入了MVCC和LBCC解决幻读问题
LBCC
lbcc用到临键锁,间隙锁,和行所
假设结构中有这四个索引元素,当我们通过主键索引查询一条记录,并且通过这条记录通过for update枷锁的时候,这时候会产生一个record lock也就是记录锁或者说行锁锁定id=1的索引,被锁定的记录在锁释放之前无法做任何操作
如何解决范围查询时,俩次得到的结果不一致呢?
如果通过这样一条语句进行锁定的时候
select * from user where id>4 and id <7 for update;
另外的事务执行insert语句会被阻塞
insert into user(id,name)values (5,'mini')
直到前面获得锁的事务被释放掉
所以在innodb中设计了一种间隙锁,它的主要功能是锁定一定范围内的索引数据(gap锁)
当对 id>4 and id<7加锁的时候,会针对b+树4和7这个开区间范围的索引加间隙锁
以为这在这种隔离级别下其他事务对这个区间的数据进行插入,插入更新删除的时候都会被锁住
但是还有另外的情况
select * from user where id>4 for update;
它需要锁定多个索引区间,所以在这种情况下innodb引入了next-key lock机制,next-keylock是间隙锁+记录锁的合集
间隙锁:只锁定俩个索引之间的引用间隙
next-key lock(临建锁):锁定多个索引区间
虽然innodb中通过间隙锁的方式解决了幻读问题,但是枷锁之后一定会影响并发性能,因此如果对性能要求较高的情况下,可以把这个隔离级别设置成rc,这个即便中不存在间隙锁