执行 delete from t1 where id = 10;MySQL会加什么锁?

思考一个问题:下面一条简单的SQL,它加什么锁?

  • delete from t1 where id = 10;

带着你的答案,我们继续往下看。

如果要分析上述SQL的加锁情况,必须了解这个SQL的执行前提,MySQL的隔离级别是什么?id列是不是主键?id列有没有索引?前提不同加锁处理的方式也不同。

可能的情况:

  • id列是不是主键?
  • MySQL的隔离级别是什么?
  • id列如果不是主键,那么id列上有索引吗?
  • id列上如果有二级索引,那么这个索引是唯一索引吗?
  • SQL的执行计划是什么?索引扫描?全表扫描?

根据上述情况,有以下几种组合:

  • id列是主键,RC隔离级别
  • id列是二级唯一索引,RC隔离级别
  • id列是二级非唯一索引,RC隔离级别
  • id列上没有索引,RC隔离级别
  • id列是主键,RR隔离级别
  • id列是二级唯一索引,RR隔离级别
  • id列是二级非唯一索引,RR隔离级别
  • id列上没有索引,RR隔离级别

问题看起来变得复杂了,事实上,要分析加锁,就得考虑这么多情况,不过只要你选定了一种组合,SQL需要加哪些锁,其实也就确定了。

聊一聊几个比较经典的组合:

组合一:id主键+RC

大部分系统都是Read Committed隔离级别,id列是主键,这种情况只需要将主键上,id = 10的记录加上X锁即可。见下图:

结论:id是主键时,此SQL只需要在id=10这条记录上加X锁即可。

组合二:id唯一索引+RC

id是一个Unique的二级索引键值。那么在RC隔离级别下,delete from t1 where id = 10; 需要加什么锁呢?

见下图:

name列是主键,id列是唯一索引。此时,加锁的情况由于组合一有所不同。由于id是唯一索引,因此delete语句会选择走id列的索引进行where条件的过滤,在找到id=10的记录后,首先会将唯一索引上的id=10索引记录加上X锁,同时,会根据读取到的name列,回主键索引,然后将聚簇索引上的name = ‘d’ 对应的主键索引项加X锁。

结论:若id列上有唯一索引。那么SQL需要加两个X锁,一个对应于id唯一索引上的id = 10的记录,另一把锁对应于聚簇索引上的[name=’d’,id=10]的记录

组合三:id非唯一索引+RC

id列只有一个普通的索引,那么此时会持有哪些锁?

见下图:

首先,id列索引上,满足id = 10查询条件的记录,均已加锁。同时,这些记录对应的主键索引上的记录也都加上了锁。与组合二唯一的区别在于,组合二最多只有一个满足等值查询的记录,而组合三会将所有满足查询条件的记录都加锁。

结论:若id列上有非唯一索引,那么对应的所有满足SQL查询条件的记录,都会被加锁。同时,这些记录在主键索引上的记录,也会被加锁。

组合四:id无索引+RC

id列上没有索引,where id = 10;这个过滤条件,没法通过索引进行过滤,那么只能走全表扫描做过滤。对应于这个组合,SQL会加什么锁?

见下图:

由于id列上没有索引,因此只能走聚簇索引,进行全部扫描。从图中可以看到,满足删除条件的记录有两条,但是,聚簇索引上所有的记录,都被加上了X锁。无论记录是否满足条件,全部被加上X锁。既不是加表锁,也不是在满足条件的记录上加行锁。有人可能会问?为什么不是只在满足条件的记录上加锁呢?这是由于MySQL的实现决定的。如果一个条件无法通过索引快速过滤,那么存储引擎层面就会将所有记录加锁后返回,然后由MySQL Server层进行过滤。因此也就把所有的记录,都锁上了。

结论:若id列上没有索引,SQL会走聚簇索引的全扫描进行过滤,由于过滤是由MySQL Server层面进行的。因此每条记录,无论是否满足条件,都会被加上X锁。但是,为了效率考量,MySQL做了优化,对于不满足条件的记录,会在判断后放锁,最终持有的,是满足条件的记录上的锁,但是不满足条件的记录上的加锁/放锁动作不会省略。同时,优化也违背了2PL的约束。

面的四个组合,都是在Read Committed隔离级别下的加锁行为,接下来的四个组合,是在Repeatable Read隔离级别下的加锁行为。

组合五:id主键+RR

id列是主键列,Repeatable Read隔离级别,针对delete from t1 where id = 10; 这条SQL,加锁与组合一:[id主键,Read Committed]一致。

组合六:id唯一索引+RR

组合六的加锁,与组合二:[id唯一索引,Read Committed]一致。两个X锁,id唯一索引满足条件的记录上一个,对应的聚簇索引上的记录一个。

组合七:id非唯一索引+RR

在RR隔离级别下,为了防止幻读的发生,会使用Gap锁。这里,你可以把Gap锁理解为,不允许在数据记录前面插入数据。对应于这个组合,SQL会加什么锁?

见下图:


结论:Repeatable Read隔离级别下,id列上有一个非唯一索引,对应SQL:delete from t1 where id = 10; 首先,通过id索引定位到第一条满足查询条件的记录,加记录上的X锁,加GAP上的GAP锁,然后加主键聚簇索引上的记录X锁,然后返回;然后读取下一条,重复进行。直至进行到第一条不满足条件的记录[11,f],此时,不需要加记录X锁,但是仍旧需要加GAP锁,最后返回结束。什么时候会取得gap lock或nextkey lock 这和隔离级别有关,只在REPEATABLE READ或以上的隔离级别下的特定操作才会取得gap lock或nextkey lock。

组合八:id无索引+RR

Repeatable Read隔离级别下的最后一种情况,id列上没有索引。此时SQL:delete from t1 where id = 10; 没有其他的路径可以选择,只能进行全表扫描。最终的加锁情况,见下图:


结论:在Repeatable Read隔离级别下,如果进行全表扫描的当前读,那么会锁上表中的所有记录,同时会锁上聚簇索引内的所有GAP,杜绝所有的并发 更新/删除/插入 操作。当然,也可以通过触发semi-consistent read,来缓解加锁开销与并发影响,但是semi-consistent read本身也会带来其他问题,不建议使用。

总结

本文对MySQL一些基础性的知识点进行了详细的总结,参考了网上和书上比较多的资料和实例。希望能对各位的学习有所帮助。

更多精彩内容,关注我们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年元旦节放假通知

致尊敬的客户以及全体同仁: 旧岁已展千重锦,新年再进百尺竿。在这辞旧迎新之际,易天光通信提前祝您元旦快乐!生意兴隆,身体健康,万事如意!根据国家法定假期的规定,并结合公司实际情…

VGG网络分析与demo实例

参考自 up主的b站链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG(Visual Geometry Group)提出,斩获该年 Imag…

【网安 | 网络协议】ARP协议(地址解析协议)

前言 在使用nmap时可以使用-PR指令,通过发送ARP请求包进行主机存活探测。 那么这一过程的原理是什么呢? 在了解什么是ARP协议后,问题就迎刃而解了。 概念 地址解析协议,即ARP(Address Resolution Protocol&#xf…

《运维人员的未来:IT界的“万金油“如何继续闪耀光芒》

文章目录 每日一句正能量前言35岁被称为运维半衰期,究竟为何?如何顺利过渡半衰期运维的职业发展路径后记 每日一句正能量 凡事顺其自然,遇事处于泰然,得意之时淡然,失意之时坦然,艰辛曲折必然,历…

运维大模型探索之 Text2PromQL 问答机器人

作者:陈昆仪(图杨) 大家下午好,我是来自阿里云可观测团队的算法工程师陈昆仪。今天分享的主题是“和我交谈并获得您想要的PromQL”。今天我跟大家分享在将AIGC技术运用到可观测领域的探索。 今天分享主要包括5个部分:…

2023RT-Thread开发者大会

参加了一次RT-Thread的开发者大会,相当有意思,虽然一天奔波挺累,但睡了半天之后简单剪了下22号的视频,也就有时间写自己的参会笔记了。 与openEuler社区不同,RT-Thread社区更专注于嵌入式,与硬件厂商结合较…

【隐私保护】Presidio简化了PII匿名化

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

使用Java语言创建方法遍历二维数组

一、基本思想 遍历完成一个维度的时候换一次行,每次输出数字的时候增加一个间隔 创建一个独立于输出函数之外的遍历方法;通过使用这个方法来遍历二维数组并以矩阵的形式输出出来。 二、基本代码 public class ArrayDoubleDemo {public static void ma…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件,所有功能均可使用。可以直接下载 下方是演示照片

司铭宇老师:如何让企业销售培训效果落地

如何让企业销售培训效果落地 在企业销售培训中,我们经常听到一个词,那就是“落地”。所谓的“落地”,简单来说就是将培训中所学到的知识和技能转化为实际的工作行动,从而提高销售业绩。但是,如何才能让销售培训效果真…

树与堆的基本概念

当看到这里的时候,相信你的链表,队列,栈学的也差不多可以了,那么接下来让我们一起进入树的学习吧! 一.树的概念以及一些知识记忆 树的定义: 树是一种 非线性 的数据结构,它是由 n &#xff08…

顺序表的实现(头插、尾插、头删、尾删、查找、删除、插入)

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为: 3.2 接口实现: 四、基本操作实现 4.1顺序表初始化 4.2检查空间,如果满了,进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…

Matplotlib_Matplotlib初相识

一、认识matplotlib: Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。 Matplotlib可用于Python脚本,Python和IPy…

sqlite3 c++ VS编译生成静态库

官网 https://www.sqlite.org/download.html 下载sqlite-amalgamation和x86版本下载sqlite-dll-win32-x86、x64位版本sqlite-dll-win64-x64 解压 SQLITE-AMALGAMATION包含 shell.csqlite3.csqlite3.hsqlite3ext.hsqlite-dll-win32-x86包含 sqlite3.def sqlite3.dll建立一个空…

什么样的猫粮好?新手必备!5款备受好评的主食冻干推荐!

猫咪生骨肉主食冻干猫粮喂养方式是越来越火了,作为一个离职的十年经验宠物护理师,对宠物健康营养方面的知识一直在研究,不光是为了我自己养的猫咪身体健康,也要为客户的猫咪健康负责!现在很多养猫人士对主食冻干猫粮喂…

我们一起动手学大模型应用开发

大模型正逐步成为信息世界的新革命力量,其通过强大的自然语言理解、自然语言生成能力,为开发者提供了新的、更强大的应用开发选择。 随着国内外井喷式的大模型 API 服务开放,如何基于大模型 API 快速、便捷地开发具备更强能力、集成大模型的…

类注解存储Bean的命名问题

在使用类注解存储Bean后,在获取Bean对象时,Bean对象的命名是怎样的呢?为什么有时候我们输入类型的小写可以获取到,为什么有的时候这样做获取不到呢? Teacher teacher context.getBean("teacher",Teacher.cl…

ctfshow 杂项签到

ctfshow的杂项签到题,下载压缩包之后里面有图片。 直接将图片用010editor打开,检索ctfshow可以看到答案。

BUUCTF——Reverse——reverse1

1、题目 2、工具 Exeinfo PE:查壳工具。IDA:是一款功能强大的反汇编工具,用于分析和逆向工程二进制文件。 3、方法 下载压缩包并解压,得到一个.exe文件。 打开后需要输入flag。随便输入一个字符串,点击确定后自动退…

Unity 人物方向旋转详细讲解

Unity 人物方向旋转详细讲解 人物的旋转有很多种一、在介绍之前我们需要理解Unity的向量也就是Vector3二、下面我们创建两个小球f1,f2左边的为f2 右边的为f1 三、我们将小球坐标用白色直线画出来,两个小球之间用黑色线画出来,两个小球的向量用黄线表示接…