mysql临键锁_innodb临键锁锁定范围

本文介绍了MySQL InnoDB存储引擎中临键锁(Next-Key Locks)的概念及其作用,用于防止幻读问题。通过案例分析了不同情况下的锁行为,包括等值查询和范围查询下对行锁、间隙锁的影响,以及如何避免死锁。讨论了临键锁对插入、删除和读取操作的限制,并提供了参考链接深入理解相关机制。
摘要由CSDN通过智能技术生成

临键锁解决当前读的幻读问题(通过锁定范围,使另外一个事务不能插入),mvcc解决不加锁读的幻读问题。

create table test(

`id` int,

`grade` char(1),

`name` varchar(20),

primary key (`id`),

key grade_idx (`grade`)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test values(1,'a','xiaoa');

insert into test values(4,'e','xiaoe');

insert into test values(8,'l','xiaol');

insert into test values(12,'o','xiaoo');

insert into test values(16,'r','xiaor');

insert into test values(20,'u','xiaou');

insert into test values(24,'w','xiaow');

insert into test values(28,'z','xiaoz');

#############################

insert into test values(1,'a','xiaoa'); (-,a]

insert into test values(4,'e','xiaoe'); (a,e]

insert into test values(8,'l','xiaol'); (e,l]

insert into test values(12,'o','xiaoo'); (l,o]

insert into test values(16,'r','xiaor'); (o,r]

insert into test values(20,'u','xiaou'); (r,u]

insert into test values(24,'w','xiaow'); (u,w]

insert into test values(28,'z','xiaoz'); (w,z]

(z,+)

innodb 默认才用临键锁,

如果查询没有命中索引,则退化为表锁;

如果等值查询唯一索引且命中唯一1条记录,则退化为行锁;

如果等值查询唯一索引且没有命中记录,则退化为临近结点的间隙锁;

如果范围查询唯一索引或查询非唯一索引且命中记录,则锁定所有命中行的临键锁 ,并同时锁定最大记录行下一个区间的间隙锁。

如果范围查询非唯一索引且没有命中记录,退化为临近结点的间隙锁(包括结点也被锁定)。

注意:被锁定的范围其他事务无法进行插入和删除操作,但可以select..for update;

参考:https://www.cnblogs.com/crazylqy/p/7773492.html

bf01c9271eab13cc6e9798327546d598.png

6f5e977df349f11a4f4069cf73e9b80f.png

session 2(id=3可插入;id=108无法插入,存在gap lock;id=123的记录无法select..in share mode,因为该记录上存在record lock;id=125可以被select..in share mode和update,这点比较奇怪,应该这也算是当前读,不过后来查看官方文档得知,gap锁只会阻塞insert操作,因为gap间隙中是不存在任何记录的,除了insert操作,其他的操作结果应该都等价于空操作,mysql就不去阻塞它了)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值