前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 主键索引在 RR 和 RC 隔离级别下的加锁情况总结

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

作者头像
业余草
发布2019-08-14 16:53:50
1.9K0
发布2019-08-14 16:53:50
举报
文章被收录于专栏:业余草

我今天抽时间给大家总结一个 MySQL InnoDB 存储引擎各种不同 SQL 情况下,加行锁、间隙锁、next-key lock 做一个总结。如果有错误的地方,请大家指正!

640?wx_fmt=png
640?wx_fmt=png

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

640?wx_fmt=png
640?wx_fmt=png

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

640?wx_fmt=png
640?wx_fmt=png

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

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

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

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

640?wx_fmt=png
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
640?wx_fmt=png

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

640?wx_fmt=png
640?wx_fmt=png

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

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

640?wx_fmt=png
640?wx_fmt=png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年06月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档