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,这个即便中不存在间隙锁

Last modification:November 17, 2023
如果觉得我的文章对你有用,请随意赞赏