MySQL 主键索引在 RR 和 RC 隔离级别下的加锁情况总结

点击上方“业余草”,选择“置顶公众号”

第一时间获取技术干货和业界资讯!


640?wx_fmt=png


最近群里不少人讨论了一些高质量的问题。我今天抽时间给大家总结一个 MySQL InnoDB 存储引擎各种不同 SQL 情况下,加行锁、间隙锁、next-key lock 做一个总结。如果有错误的地方,请大家指正!


640?wx_fmt=png


为了讲清楚相关加锁的情况,我们先来创建一个测试验证用的表。结构如下所示:

640?wx_fmt=png

然后插入几条测试数据。注意,我是在 MySQL 5.7 版本上测试的

640?wx_fmt=png

在开始之前,我先来解释一下,RR 和 RC。


RR 隔离级别就是,可重复读。REPEATABLE READ。


RC 隔离级别就是,读已提交。READ COMMITTED。


搞明白 RR 和 RC 后,我们先来看第一种情况。查询条件是聚簇索引,也就是主键索引的精确匹配情况。

640?wx_fmt=png

上面这种情况下,如果 SQL 是精确查询,不管是 RR 还是 RC 隔离级别下,都会在命中的索引上加 record lock(行锁)。X 锁是排它锁(Exclusive Lock),也有人称作是写锁。S 锁是共享锁(Shared Lock),也有人称作是读锁。不管是 X 锁,还是 S 锁,都是加在行上的。注意,行锁不是加在记录上的,而是加在索引上的!


第二种情况,如果是范围查询,那么在在 RC 隔离级别下,会在所有命中的行的聚簇索引上加 record locks(锁行)。因为 RC 级别下是没有间隙锁的。

640?wx_fmt=png

第三种情况,在 RR 隔离级别下,会在所有命中的行的聚簇索引上加 next-key locks(锁住行和间隙)。最后命中的索引的后一条记录,也会被加上 next-key lock。


640?wx_fmt=png

第四种情况,如果查询结果为空,即没有命中任何聚族索引,那么,在 RC 隔离级别下,什么也不会锁。


第五种情况,如果查询结果为空,即没有命中任何聚族索引,那么,在 RR 隔离级别下,会锁住查询目标所在的间隙。

640?wx_fmt=png

以上,对于主键索引加锁的场景基本上已经全部覆盖到了。如果你还有什么疑问想讨论的,请加我微信:xttblog。


RR 隔离级别实现起来,要比 RC 复杂的多。给你留一个问题,MySQL 是出于什么样的考虑,默认是采用 RR 隔离级别?


640?wx_fmt=png

扫描海报上的二维码,返现9元的加我微信:xttblog

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业余草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值