InnoDB的三种行锁(提供具体sql执行案例分析)

InnoDB存储引擎有3种行锁的算法,其分别是:

  • Record Lock(记录锁):单个行记录上的范围 (锁住某一行记录)
  • Gap Lock(间隙锁):间隙锁,锁定一个范围,但不包含记录本身 (锁住一段左开右开的区间)
  • Next-key Lock(临键锁):Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身 (锁住一段左开右闭的区间)

在学习具体行锁加锁规则之前,小伙伴们需要记住加锁规则的两条核心:

1)查找过程中访问到的对象才会加锁
这句话该怎么理解?比如有主键 id 为 1 2 3 4 5 … 10 的10 条记录,我们要找到 id = 7 的记录。注意,查找并不是从第一行开始一行一行地进行遍历,而是根据 B+ 树的特性进行二分查找,所以一般存储引擎只会访问到要找的记录行(id = 7)的相邻区间

2)加锁的基本单位是 Next-key Lock

哪些语句上面会加行锁?

1.对于常见的 DML 语句(如 UPDATE、DELETE 和 INSERT ),InnoDB 会自动给相应的记录行加写锁
2.默认情况下对于普通 SELECT 语句,InnoDB 不会加任何锁,但是在 Serializable 隔离级别下会加行级读锁
上面两种是隐式锁定,InnoDB 也支持通过特定的语句进行显式锁定:
3.SELECT * FROM table_name WHERE … FOR UPDATE,加行级写锁
4.SELECT * FROM table_name WHERE … LOCK IN SHARE MODE,加行级读锁

下面我们通过一些sql,来看下不同情况下sql的加锁情况

现在有这么一张表,id是主键(唯一索引),age是普通索引,name就是普通字段没有任何索引,如下图所示:
在这里插入图片描述

1.唯一索引的等值查询

当我们用唯一索引进行等值查询的时候,mysql会根据查询的记录是否存在,使用不同的加锁规则:

1.当查询记录是存在的,Next-key Lock(临键锁)会的退化成Record Lock(记录锁);
2.当查询的记录不存在,Next-key Lock(临键锁)会的退化成Gap Lock(间隙锁);

(1)查询的记录存在

例如: select * from user where id = 3 for update;

结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (1, 3]
不过,由于这个唯一索引等值查询的记录 id = 35 是存在的,因此,Next-key Lock 会退化成记录锁,因此最终的加锁范围是 id = 3 这一行数据

(2)查询的记录不存在

例如:select * from user where id = 4 for update;

结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (3, 6]

  • 这里为什么是 (3,6] 而不是 (3, 4],因为 id = 4 的记录不存在呀,InnoDB 先找到 id = 3 的记录,发现不匹配,于是继续往下找,发现 id = 6,因此,id = 6 的这一行被扫描到了,所以整体的加锁范围是 (3, 6]

由于这个唯一索引等值查询的记录 id = 4 是不存在的,因此,Next-key Lock 会退化成间隙锁,因此最终在主键 id 上的加锁范围是 Gap Lock (3, 6)

2.唯一索引的范围查询

唯一索引范围查询的规则和等值查询的规则一样,只有一个区别,就是唯一索引的范围查询需要一直向右遍历到第一个不满足条件的记录,下面结合案例来分析:

例如:select * from user where id >= 3 and id < 4 for update;

先来看语句查询条件的前半部分 id >= 3,因此,这条语句最开始要找的第一行是 id = 3,结合加锁的两个核心,需要加上 Next-key Lock (1,3]。又由于 id 是唯一索引,且 id = 3 的这行记录是存在的,因此会退化成记录锁,也就是只会对 id = 3 这一行加锁。

再来看语句查询条件的后半部分 id < 4,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 6 这一行停下来,然后加 Next-key Lock (3, 6],重点来了,但由于 id = 6 不满足 id < 4,因此会退化成间隙锁,加锁范围变为 (3, 6)。

所以,上述语句在主键 id 上的最终的加锁范围是 Record Lock id = 3 以及 Gap Lock (3, 6)

3.非唯一索引的等值查询

当我们用非唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:

1.当查询的记录是存在的,除了会加 Next-key Lock 外,还会额外加间隙锁(规则是向下遍历到第一个不符合条件的值才能停止),也就是会加两把锁
2.当查询的记录是不存在的,Next-key Lock 会退化成间隙锁(这个规则和唯一索引的等值查询是一样的)

(1)查询的记录存在

例如: select * from user where age = 12 for update;

结合加锁的两条核心,这条语句首先会对普通索引 age 加上 Next-key Lock,范围是 (10,12]
又因为是非唯一索引等值查询,且查询的记录 age = 12 是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是 (12,15)
所以,上述语句在普通索引 age 上的最终加锁范围是 Next-key Lock (10,12] 以及 Gap Lock (12,15)

(2)查询的记录不存在

例如:select * from user where age = 13 for update;

结合加锁的两条核心,这条语句首先会对普通索引 age 加上 Next-key Lock,范围是 (12,15]
但是由于查询的记录 age = 13 是不存在的,因此 Next-key Lock 会退化为间隙锁,即最终在普通索引 age 上的加锁范围是 (12,15)。

4.非唯一索引的范围查询

范围查询和等值查询的区别在上面唯一索引章节已经介绍过了,就是范围查询需要一直向右遍历到第一个不满足条件的记录,和唯一索引范围查询不同的是,非唯一索引的范围查询并不会退化成 Record Lock 或者 Gap Lock。

例如: select * from user where age >= 12 and age < 14 for update;

先来看语句查询条件的前半部分 age >= 12,因此,这条语句最开始要找的第一行是 age = 12,结合加锁的两个核心,需要加上 Next-key Lock (10,12]。虽然非唯一索引 age = 12 的这行记录是存在的,但此时并不会像唯一索引那样退化成记录锁。

再来看语句查询条件的后半部分 age < 14,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 age= 15 这一行停下来,然后加 Next-key Lock (12, 15]。虽然 age = 15 不满足 age < 14,但此时并不会像唯一索引那样退化成间隙锁。

所以,上述语句在普通索引 age 上的最终的加锁范围是 Next-key Lock (10, 12] 和 (12, 15],也就是 (10, 15]。

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

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

相关文章

人工智能(pytorch)搭建模型14-pytorch搭建Siamese Network模型(孪生网络),实现模型的训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型14-pytorch搭建Siamese Network模型(孪生网络)&#xff0c;实现模型的训练与预测。孪生网络是一种用于度量学习&#xff08;Metric Learning&#xff09;和比较学习&#xff08;Compariso…

基于深度学习的人脸面部表情识别系统【含Python源码+PyqtUI界面+原理详解】

功能演示 摘要&#xff1a;面部表情识别&#xff08;Facial Expression Recognition&#xff09;是一种通过技术手段识别人物图像中人脸面部表情的技术。本文详细介绍了其实现的技术原理&#xff0c;同时给出完整的Python实现代码、训练好的深度学习模型&#xff0c;并且通过Py…

GO语言使用最简单的UI方案govcl

接触go语言有一两年时间了。 之前用Qt和C#写过桌面程序&#xff0c;C#会被别人扒皮&#xff0c;极度不爽&#xff1b;Qt默认要带一堆dll&#xff0c;或者静态编译要自己弄或者找库&#xff0c;有的库还缺这缺那&#xff0c;很难编译成功。 如果C# winform可以编译成二进制原生…

商品减库在Redis中的运用

一.商品减库中存在问题 1.传统的代码 1.1引入jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.…

基于tensorflow深度学习的猫狗分类识别

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

机器学习之K-means聚类算法

目录 K-means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K-means聚类算法 K-means聚类算法是一种无监督的学习方法&#xff0c;通过对样本数据进行分组来发现数据内在的结构。K-means的基本思想是将n个实例分成k个簇&#xff0c;使得同一簇内数据相…

基于小程序的用户服务技术研究

目录 1. 小程序开发技术原理 2. 用户服务设计3. 数据库设计和管理4. 安全和隐私保护5. 性能优化和测试总结 关于基于小程序的用户服务技术研究&#xff0c;这是一个非常广泛和复杂的领域&#xff0c;需要涉及多个方面的知识和技术。一般来说&#xff0c;基于小程序的用户服务技…

怎么学习数据库连接与操作? - 易智编译EaseEditing

学习数据库连接与操作可以按照以下步骤进行&#xff1a; 理解数据库基础知识&#xff1a; 在学习数据库连接与操作之前&#xff0c;首先要了解数据库的基本概念、组成部分和工作原理。 学习关系型数据库和非关系型数据库的区别&#xff0c;了解常见的数据库管理系统&#xff…

HTTP协议

HTTP协议专门用于定义浏览器与服务器之间交互数据的过程以及数据本身的格式 HTTP概述 HTTP是一种客户端&#xff08;用户&#xff09;请求和服务器&#xff08;网站&#xff09;应答的标准&#xff0c;它作为一种应用层协议&#xff0c;应用于分布式、协作式和超媒体信息系统…

【springboot】—— 后端Springboot项目开发

后端Springboot项目开发 步骤1 先创建数据库&#xff0c;并在下面创建一个user表&#xff0c;插入数据&#xff0c;sql如下&#xff1a; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,email varchar(255) NOT NULL COMMENT 邮箱,password varchar(255)…

王益分布式机器学习讲座~Random Notes (1)

0 并行计算是什么&#xff1f;并行计算框架又是什么 并行计算是一种同时使用多个计算资源&#xff08;如处理器、计算节点&#xff09;来执行计算任务的方法。通过将计算任务分解为多个子任务&#xff0c;这些子任务可以同时在不同的计算资源上执行&#xff0c;从而实现加速计…

ChatGLM2-6B发布,位居C-Eval榜首

ChatGLM-6B自2023年3月发布以来&#xff0c;就已经爆火&#xff0c;如今6月25日&#xff0c;清华二代发布&#xff08;ChatGLM2-6B&#xff09;&#xff0c;位居C-Eval榜单的榜首&#xff01; 项目地址&#xff1a;https://github.com/THUDM/ChatGLM2-6B HuggingFace&#xf…

Sequential用法

目录 1.官方文档解释 1.1原文参照 1.2中文解释 2.参考代码 3.一些参考使用 3.1生成网络 3.2 感知机的实现 3.3组装网络层 1.官方文档解释 1.1原文参照 A sequential container. Modules will be added to it in the order they are passed in the constructor. A…

【书】《Python全栈测试开发》——浅谈我所理解的『自动化』测试

目录 1. 自动化测试的What and Why?1.1 What1.2 Why2. 自动化的前戏需要准备哪些必备技能?3. 自动化测试类型3.1 Web自动化测试3.1.1 自动化测试设计模式3.1.2 自动化测试驱动方式3.1.3 自动化测试框架3.2 App自动化测试3.3 接口自动化测试4. 自动化调优《Python全栈测试开发…

Springboot钉钉免密登录集成(钉钉小程序和H5微应用)

欢迎访问我的个人博客:www.ifueen.com RT&#xff0c;因为业务需要把我们系统集成到钉钉里面一个小程序和一个H5应用&#xff0c;并且在钉钉平台上面实现无感登录&#xff0c;用户打开我们系统后不需要再输入密码即可登录进系统&#xff0c;查阅文档实际操作过之后记录一下过程…

Qt6.2教程——4.QT常用控件QPushButton

一&#xff0c;QPushButton简介 QPushButton是Qt框架中的一种基本控件&#xff0c;它是用户界面中最常见和最常用的控件之一。QPushButton提供了一个可点击的按钮&#xff0c;用户可以通过点击按钮来触发特定的应用程序操作。比如&#xff0c;你可能会在一个对话框中看到"…

VMware Tools安装“保熟“技巧

网上关于如何安装VMware Tools也有很多帖子,但是基本很难对症下药。下面笔者给出两种情况&#xff0c;读者可根据自己概况定位自己的问题&#xff0c;从而进行解决。 如果读者安装操作系统时是如笔者如下截图 那么读者可参考这个解决方案 安装VMware Tools选项显示灰色的正确解…

高等数学下拾遗+与matlab结合

如何学好高等数学 高等数学是数学的一门重要分支&#xff0c;包括微积分、线性代数、常微分方程等内容&#xff0c;它是许多理工科专业的基础课程。以下是一些学好高等数学的建议&#xff1a; 扎实的基础知识&#xff1a;高等数学的内容很多&#xff0c;包括初等数学的一些基…

【数据库】关系型数据库与非关系型数据库解析

【数据库】关系型数据库与非关系型数据库解析 文章目录 【数据库】关系型数据库与非关系型数据库解析1. 介绍2. 关系型数据库3. 非关系型数据库4. 区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同4.4 总结 参考 1. 介绍 一个通俗易懂的比喻&#xff1a;关系型…

哈工大计算机网络传输层协议详解之:可靠数据传输的基本原理

哈工大计算机网络传输层协议详解之&#xff1a;可靠数据传输的基本原理 哈工大计算机网络课程传输层协议详解之&#xff1a;流水线机制与滑动窗口协议哈工大计算机网络课程传输层协议详解之&#xff1a;TCP协议哈工大计算机网络课程传输层协议详解之&#xff1a;拥塞控制原理剖…