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

news2024/11/20 16:29:38

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]。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十大公认音质好的骨传导耳机,几款音质排行靠前的骨传导耳机

骨传导耳机是通过头部骨迷路传递声音&#xff0c;而不是直接通过耳膜的振动来传递声音。与传统的入耳式耳机相比&#xff0c;骨传导耳机不会堵耳朵&#xff0c;在跑步、骑车等运动时可以更好的接收外界环境音&#xff0c;保护听力&#xff0c;提升安全性。此外&#xff0c;骨传…

Canvas基本使用

1.canvas基本使用 1.1.说明&#xff1a; canvas是双标签,h5中新增的属性默认宽高为300*150浏览器默认canvas展示的是一张图片给canvas添加文字内容是没有任何意义的canvas画布&#xff1a;绘制图形&#xff0c;显示一个文字&#xff0c;必须通过js操作 不要通过样式去设置画…

15.OCR

15.1 OCR流水线及七工作原理 Photo OCR&#xff1a;照片 光学字符识别(photo optical character recognition) Photo OCR注重的问题&#xff1a;如何让计算机都出图片中的文字信息&#xff0c;它有以下步骤&#xff1a; 首先给定某张图片&#xff0c;它将图像扫描一遍&#…

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

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

零基础想入门网安行业,看这一篇就够了!!!

由于我之前写了不少网络安全技术相关的故事文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人在微信里问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff…

跟着AIGC学Linux:简介(一)

文章目录 1.Linux内核的历史2.基本概念3.发行版4.Linux应用领域5.Linux VS Windows横向对比表格&#xff1a; 1.Linux内核的历史 Linux内核最初由一位名叫Linus Torvalds的芬兰计算机科学家于1991年创建。当时&#xff0c;Torvalds是一名赫尔辛基大学的学生&#xff0c;他在寻…

ROS:话题通信机制详解

目录 ROS&#xff1a;通信机制一、话题通信简介二、话题通信实操&#xff08;C&#xff09;2.1分析2.2发布方代码2.3订阅方代码2.4配置CMakeLists.txt2.5执行2.6注意 三、话题通信实操&#xff08;python&#xff09;3.1分析3.2发布方代码3.3订阅方代码3.4添加可执行权限3.5配置…

Apache Log4j2 漏洞原理

Apache Log4j 远程代码执行漏洞 1.漏洞危害 Apache Log4j被发现存在一处任意代码执行漏洞&#xff0c;由于Apache Log4j2某些功能存在递归解析功能&#xff0c;攻击者可直接构造恶意请求&#xff0c;触发远程代码执行漏洞。经验证&#xff0c;Apache Struts2、Apache Solr、Ap…

Win10控制面板在哪里打开?Win10控制面板打开方式介绍

Win10控制面板在哪里打开&#xff1f;当前很多用户都在使用Win10系统&#xff0c;一些新手用户不清楚在哪里才能打开Win10系统的控制面板&#xff0c;以下给大家介绍三种方式&#xff0c;帮助用户们轻松快速打开Win10控制面板&#xff0c;打开控制面板后用户即可展开不同的设置…

5-1图像信息提取适当剪掉像素点(matlab程序)

代码及运行结果 clear ; close all; gr imread(cameraman.tif); subplot(1,3,1); imshow(gr); subplot(1,3,2); D dct2(gr); F log(abs(D)); imshow(F,[]); subplot(1,3,3); D(abs(D)<200) 0; %会丢掉很多点 &#xff0c;但是原图还可识别&#xff0c;适合做信息提取 M …

这所院校很保护一志愿,学硕爆冷,全部录取,专硕初试第三竟主动放弃录取!

一、学校及专业介绍 广州大学&#xff08;Guangzhou University&#xff09;&#xff0c;简称广大&#xff08;GU&#xff09;&#xff0c;是由广东省广州市人民政府举办的全日制普通高等学校&#xff0c;实行省市共建、以市为主的办学体制&#xff0c;是国家“111计划”建设高…

c语言结构体属性之__attribute__((packed))

c语言结构体属性之__attribute__((packed)) 0. 引出 事情是这样的&#xff0c;最近在做代码移植时见到了这样一段代码 typedef struct {uint16_t len;uint8_t data[PAIRING_MAX_LEN]; } pairing_rx_buffer_t;static pairing_rx_buffer_t pairing_rx_buffer {}; typedef str…

四大世界权威大学排名指标及侧重点

U.S.News、QS、ARWU、THE是公认的四大权威世界大学排名&#xff0c;每个排名的侧重点各有不同&#xff0c;故知识人网小编撰文加以介绍。 很多博士后、访问学者和联合培养博士的申请者会注重学校排名。那么都有哪些排名体系呢&#xff1f;一般来说&#xff0c;国际公认的四大权…

PLC技能在职场中的竞争力如何?

在当前的工作市场上&#xff0c;仅仅掌握PLC可能会限制您的竞争力。尽管PLC在自动化控制系统中扮演重要的角色&#xff0c;但现代工业界对多样化技能和知识的需求越来越高。 为了提高竞争力&#xff0c;以下是一些建议&#xff1a; 学习其他自动化技术&#xff1a;除了PLC&am…

人脸跟踪:基于人脸检测API的连续检测与姿态估计技术

人脸跟踪技术在视频监控、虚拟现实和人机交互等领域发挥着重要作用。通过连续的人脸检测与姿态估计&#xff0c;可以实现对人脸在视频序列中的跟踪和姿态分析。 本文将介绍基于人脸检测API的人脸跟踪技术&#xff0c;探讨其原理、应用场景以及未来发展前景。 人脸跟踪的意义和…

typescript中interface,type和Record的使用

vitevue3ts中interface&#xff0c;type和Record的使用 vitevue3ts中interface&#xff0c;type和Record的使用 interface&#xff1a;接口type&#xff1a;类型别名 基本类型组合元组类型捕捉遍历属性 扩展 interface扩展interface&#xff08;合并&#xff09;interface扩展i…

你以为的网络工程师VS实际工作中的网络工程师

我的网工朋友&#xff0c;大家好。 前两天不是端午节嘛&#xff0c;去亲戚家吃饭。饭后闲聊说起&#xff0c;他们家的电脑开不了机了&#xff0c;问我能不能修下。 我说我不太会&#xff0c;让他们打电话报修&#xff0c;会有人上门看的。 结果亲戚蹦出一句话&#xff1a;你…

Qt Widget提升为QChartView绘制曲线

1、在工程文件"*.pro"中添加"charts"组件 在工程文件"*.pro"中添加"charts"组件&#xff0c;同时在工程文件添加qcustomplot类。 QT core gui printsupport charts下载qcustomplot类。 网址&#xff1a;https://www.qcustom…

技术小知识:分布式中的BASE和CAP原则 ③

一、CAP 理论和 BASE 理论 理论是指导业界实现的纲领&#xff0c;也是提炼了多年研究的精华&#xff0c;在分布式一致性领域&#xff0c;最主要的指导理论是 CAP 和 BASE 两个。 二、CAP理论 CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c; Consistency&…

面试官:SpringBoot如何快速实现分库分表?

一、什么是 ShardingSphere&#xff1f; shardingsphere 是一款开源的分布式关系型数据库中间件&#xff0c;为 Apache 的顶级项目。其前身是 sharding-jdbc 和 sharding-proxy 的两个独立项目&#xff0c;后来在 2018 年合并成了一个项目&#xff0c;并正式更名为 ShardingSp…