0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文彻底搞懂MySQL锁究竟锁的啥2

jf_78858299 来源:蝉沐风的码场 作者:蝉沐风 2023-03-03 10:13 次阅读

6. 意向锁

6.1. 背景

前面提到的S锁和X锁的语法规则其实是针对记录的,也就是行锁,原因是InnoDB中行锁用的最多。如果将锁的粒度和锁的基本模式排列组合一下,就会出现如下4种情况:

  • 行级S
  • 行级X
  • 表级S
  • 表级X

那么接下来的描述,也就顺理成章了。

如果事务给一个表添加了表级S锁,则:

  • 其他事务可以继续获得该表的S锁,但是无法获取该表的X锁;
  • 其他事务可以继续获得该表某些行的S锁,但是无法获取该表某些行的X锁。

如果事务给一个表添加了表级X锁,则:

  • 不论是该表的S锁、X锁,还是该表某些行的S锁、X锁,其他事务都只能干瞪眼儿,啥也获取不了。

挺好理解的吧,总之就是 S锁只能和S锁相容,X锁和其他任何锁都互斥 。问题来了,虽然用的不多,但是万一我真的想给整个表添加一个S锁或者X锁怎么办?

假如我要给表user添加一个S锁,那就必须保证user在表级别上和行级别上都不能有X锁,表级别上还好说一点,无非就是1个内存结构罢了,但是行X锁呢?必须得逐行遍历是否有行X锁吗?

同理,假如我要给表user添加一个X锁,那就必须保证user在表级别上和行级别上都不能有任何锁(SX都不能有),难不成得逐行遍历是否有SX锁吗?

遍历是不可能遍历的!这辈子都不可能遍历的!于是, 意向锁 (Intension Lock)诞生了。

6.2. 概念

我们要避免遍历,那最好的办法就是在给行加锁时,先在表级别上添加一个标识。

  • 意向共享锁(Intension Shared Lock):简称IS锁,当事务试图给行添加S锁时,需要先在表级别上添加一个IS锁;
  • 意向排他锁(Intension Exclusive Lock):简称IX锁,当事务试图给行添加X锁时,需要先在表级别上添加一个IX锁。

这样一来:

  • 如果想给user表添加一个S锁(表级锁),就先看一下user表有没有IX锁;如果有,就说明user表的某些行被加了X锁(行锁),需要等到行的X锁释放,随即IX锁被释放,才可以在user表中添加S锁;
  • 如果想给user表添加一个X锁(表级锁),就先看一下user有没有IS锁或IX锁;如果有,就说明user表的某些行被加了S锁或X锁(行锁),需要等到所有行锁被释放,随即IS锁或IX锁被释放,才可以在user表中添加X锁。

需要注意的是,意向锁和意向锁之间是不冲突的,意向锁和行锁之间也不冲突。

只有在对表添加S锁或X锁时才需要判断当前表是否被添加了IS锁或IX锁,当为表添加IS锁或IX锁时,不需要关心当前表是否已经被添加了其他IS锁或IX锁。

目前为止MySQL锁的基本模式就介绍完了,接下来回到这片文章的题目,MySQL锁,锁住的到底是什么?由于InnoDB的行锁用的最多,这里的锁自然指的是行锁。

7. 行锁的原理

既然都叫行锁了,我们姑且猜测一下,行锁锁住的是一行数据。我们做个实验。

7.1. 没有任何索引的表

我们先创建一张没有任何索引的普通表,语句如下

CREATE TABLE `user_t1` (
  `id` int DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

表中数据如下:

mysql> SELECT * FROM user_t1;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | chanmufeng  |
|    2 | wanggangdan |
|    3 | wangshangju |
|    4 | zhaotiechui |
+------+-------------+

接下来我们在两个session中开启两个事务。

  • 事务1,我们通过WHERE id = 1“锁住”第1行数据;
  • 事务2,我们通过WHERE id = 2"锁住"第2行数据。

图片

一件诡异的事情是,第2个加锁的操作被阻塞了。实际上,T2中不管我们要给user_t1中哪行数据加锁,都会失败!

为什么我SELECT一条数据,却给我锁住了整个表?这个实验直接推翻了我们的猜测, InnoDB的行锁并非直接锁定Record行

为什么没有索引的情况下,给某条语句加锁会锁住整个表呢?别急,我们继续。

7.2. 有主键索引的表

我们再创建一个表user_t2,语句如下:

CREATE TABLE `user_t2` (
	`id` int NOT NULL,
	`name` varchar(255) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

user_t1的不同之处在于为id创建了一个主键索引。表中数据依然如下:

mysql> SELECT * FROM user_t2;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | chanmufeng  |
|    2 | wanggangdan |
|    3 | wangshangju |
|    4 | zhaotiechui |
+------+-------------+

同样开启两个事务:

  • 事务1,通过WHERE id = 1“锁住”第1行数据;
  • 事务2
    • 依然使用WHERE id = 1尝试加锁,加锁失败;
    • 使用WHERE id = 2尝试加锁,加锁成功。

图片

既然锁的不是Record行,难不成锁的是id这一列吗?

我们再做最后一个实验。

7.3. 有唯一索引的表

我们再创建一个表user_t3,语句如下:

CREATE TABLE `user_t3` (
	`id` int NOT NULL,
	`name` varchar(255) DEFAULT NULL,
	PRIMARY KEY (`id`),
  UNIQUE KEY (`uk_name`) (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

user_t2的不同之处在于为name列创建了一个唯一索引。表中数据依然如下:

mysql> SELECT * FROM user_t3;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | chanmufeng  |
|    2 | wanggangdan |
|    3 | wangshangju |
|    4 | zhaotiechui |
+------+-------------+

图片

两个事务:

  • 事务1,通过name字段 “锁住”name为“chanmufeng”的数据;
  • 事务2
    • 依然使用WHERE name = “chanmufeng” 尝试加锁,可以预料,加锁失败;
    • 使用WHERE id = 1尝试给同样的行加锁,加锁失败。

通过3个实验我们发现,行锁锁住的既不是Record行,也不是Column列,那到底锁住的是什么?我们对比一下,上文的3张表的不同点在于索引不同,其实 InnoDB的行锁,就是通过锁住索引来实现的

接下来回答3个问题。

8. 三个问题

8.1. 锁住索引?没有索引怎么办?

你说锁住索引?如果我不创建索引,MySQL锁定个啥?

如果我们没有设置主键,InnoDB会优先选取一个不包含NULL值的Unique键作为主键,如果表中连Unique键也没有的话,就会自动为每一条记录添加一个叫做DB_ROW_ID的列作为默认主键,只不过这个主键我们看不到罢了。

下图是数据的行格式。看不懂的话强烈推荐看一下我上面给出的两篇文章,说得非常明白。

图片

行格式

8.2. 为什么第一个实验会锁表?

因为SELECT没有用到索引,会进行全表扫描,然后把DB_ROW_ID作为默认主键的聚簇索引都给锁住了。

8.3. 为什么通过唯一索引给数据加锁,主键索引也会被锁住?

不管是Unique索引还是普通索引,它们的叶子结点中存储的数据都不完整,其中只是存储了作为索引并且排序好的列数据以及对应的主键值。

因此我们通过索引查找数据数据实际上是在索引的B+树中先找到对应的主键,然后根据主键再去主键索引的B+树的叶子结点中找到完整数据,最后返回。所以虽然是两个索引树,但实际上是同一行数据,必须全部锁住。

下面给了一张图,让不了解索引的朋友大致了解一下。上半部分是name列创建的唯一索引的B+树,下半部分是主键索引(也叫聚簇索引)。

假如我们通过WHERE name = '王钢蛋'对数据进行查询,会先用到name列的唯一索引,最终定位到主键值为1,然后再到主键索引中查询id = 1的数据,最终拿到完整的行数据。

这两张图在我索引文章中都有哦~

图片

MySQL锁-索引

9. 总结

至此,我已经回答了文章开头的绝大多数问题。

MySQL锁,是解决资源竞争问题的一种手段。有哪些竞争呢?读—写/写—读,写—写中都会出现资源竞争问题,不同的是前者可以通过MVCC的方式来解决,但是某些情况下你也不得不用锁,因此我也顺便解释了锁和MVCC的关系。

然后介绍了MySQL锁的基本模式,包括共享锁(S锁)和排他锁(X锁),还引入了意向锁。

最后解释了锁到底锁的是什么的问题。通过3个实验,最终解释了InnoDB锁本质上锁的是索引。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7611

    浏览量

    89881
  • MySQL
    +关注

    关注

    1

    文章

    841

    浏览量

    27369
  • MVCC
    +关注

    关注

    0

    文章

    13

    浏览量

    1530
收藏 人收藏
    相关推荐
    热点推荐

    基于MySQL机制

    在数据库系统中,为了保证数据的致性和并发控制,机制发挥着至关重要的作用。尤其在关系型数据库MySQL中,其独特的机制设计更是赢得了许多开发者的喜爱。 本文将详细探讨
    的头像 发表于 09-30 11:16 1035次阅读

    redis分布式场景实现

    今天带大家深入剖析下Redis分布式彻底搞懂它。 场景 既然要搞懂Redis分布式,那肯
    的头像 发表于 09-25 17:09 866次阅读

    请问DSPflash死后,RAM还可以用吗,还是这块芯片就彻底废了?

    本帖最后由 只耳朵怪 于 2018-6-13 16:47 编辑 请问DSPflash死后,RAM还可以用吗,还是这块芯片就彻底废了?
    发表于 06-13 04:19

    InnoDB的特点和状态查询

    MySQL探秘(五)InnoDB的类型和状态查询
    发表于 08-07 11:45

    读懂eMMC究竟

    eMMC究竟?eMMC长什么样?eMMC用在哪?主要是干嘛用的?eMMC究竟是如何工作的呢?
    发表于 06-18 06:04

    360为什么会入局智能市场

    很难界定智能究竟属于哪个行业?智能是五金门锁行业、安防行业、家居行业和产业互联网行业的交汇产物。硬件是基础,安防及家居是应用,网络是消费渠道及用户交互界面,物联网让智能
    发表于 11-05 15:21 1550次阅读

    详细介绍MySQL InnoDB存储引擎各种不同类型的

    T1执行时,需要获取i=1的行的X(不需要获取t1表的意向了);T2执行时,需要获取t1表的X,T2能否获取到T1表的X
    的头像 发表于 02-20 11:12 7775次阅读
    详细介绍<b class='flag-5'>MySQL</b> InnoDB存储引擎各种不同类型的<b class='flag-5'>锁</b>

    彻底搞懂PID到底是

    先来彻底搞懂PID到底是? PID,就是比例(proportional)、积分(integral)、微分(differential),是种很常见的控制算法。在工程实际中,应用最为广
    的头像 发表于 11-13 18:21 2.6w次阅读

    数据库的机制真正的原理

    问候选人,你知道MySQL Innodb的,到底的是什么吗?关于这个问题的回答,听到过很多种,但是很少有人可以把他回答的很完美。因为想要回答好这个问题,需要对数据库的隔离级别、索引等都有
    的头像 发表于 11-12 09:33 2481次阅读

    说说MySQL有哪些

    增加自增为 innodb_autoinc_lock_mode = 2 模式时,为什么主从环境会有不安全问题的说明
    的头像 发表于 10-24 10:15 994次阅读

    MySQL是怎么加行级的?有什么规则?

    是不是很多人都对 MySQL 加行级的规则搞的迷迷糊糊,对记录会加的是 next-key 会加是间隙
    的头像 发表于 11-17 09:28 995次阅读

    彻底搞懂MySQL究竟1

    MySQL系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊MySQL。 只要学计算机,「`
    的头像 发表于 03-03 10:12 593次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>彻底</b><b class='flag-5'>搞懂</b><b class='flag-5'>MySQL</b><b class='flag-5'>锁</b><b class='flag-5'>究竟</b><b class='flag-5'>锁</b>的<b class='flag-5'>啥</b>1

    Linux互斥的作用 互斥是什么

    。如果释放互斥时有个以上的线程阻塞,那么这些阻塞的线程会被唤醒,它们都会尝试对互斥进行加锁,当有个线程成功对互斥锁上锁之后,其它线程就不能再次上锁了,只能再次陷入阻塞,等待下
    的头像 发表于 07-21 11:13 1122次阅读

    自旋和互斥的区别有哪些

    自旋 自旋与互斥很相似,在访问共享资源之前对自旋进行上锁,在访问完成后释放自旋(解锁);事实上,从实现方式上来说,互斥
    的头像 发表于 07-21 11:19 9759次阅读

    互斥和自旋的实现原理

    互斥和自旋是操作系统中常用的同步机制,用于控制对共享资源的访问,以避免多个线程或进程同时访问同资源,从而引发数据不致或竞争条件等问题。 互斥
    的头像 发表于 07-10 10:07 865次阅读

    飞凌嵌入式携手中移物联,谱写全国产化方案新生态

    4月22日,飞凌嵌入式“2025嵌入式及边缘AI技术论坛”在深圳成功举办。中移物联网有限公司(以下简称“中移物联”)携OneOS操作系统与飞凌嵌入式共同推出的工业级核心板亮相会议展区,操作系统产品部高级专家严镭受邀作《OneOS工业操作系统——助力国产化智能制造》主题演讲。

    飞凌嵌入式
    8小时前
    249

    ATA-2022B高压放大器在螺栓松动检测中的应用

    实验名称:ATA-2022B高压放大器在螺栓松动检测中的应用实验方向:超声检测实验设备:ATA-2022B高压放大器、函数信号发生器,压电陶瓷片,数据采集卡,示波器,PC等实验内容:本研究基于振动声调制的螺栓松动检测方法,其中低频泵浦波采用单频信号,而高频探测波采用扫频信号,利用泵浦波和探测波在接触面的振动声调制响应对螺栓的松动程度进行检测。通过螺栓松动检测

    Aigtek安泰电子
    1天前
    429

    MOS管驱动电路——电机干扰与防护处理

    此电路分主电路(完成功能)和保护功能电路。MOS管驱动相关知识:1、跟双极性晶体管相比,一般认为使MOS管导通不需要电流,只要GS电压(Vbe类似)高于一定的值,就可以了。MOS管和晶体管向比较c,b,e—–>d(漏),g(栅),s(源)。2、NMOS的特性,Vgs大于一定的值就会导通,适合用于源极接地时的情况(低端驱动),只要栅极电压达到4V或10V就可以

    张飞实战电子官方
    1天前
    202

    压敏(MOV)在电机上的应用剖析

    一前言有刷直流电机是一种较为常见的直流电机。它的主要特点包括:1.结构相对简单,由定子、转子、电刷和换向器等组成;2.通过电刷与换向器的接触来实现电流的换向,从而使电枢绕组中的电流方向周期性改变,保证电机持续运转;3.具有调速性能较好等优点,可以通过改变电压等方式较为方便地调节转速。有刷直流电机在许多领域都有应用,比如一些电动工具、玩具、小型机械等。但它也存

    深圳市韬略科技有限公司
    1天前
    151

    硬件原理图学习笔记

    这一个星期认真学习了硬件原理图的知识,做了一些笔记,方便以后查找。硬件原理图分为三类1.管脚类(gpio)和门电路类输入输出引脚,上拉电阻,三极管与门,或门,非门上拉电阻:正向标志作用,给悬空的引脚一个确定的状态三极管:反向三极管(gpio输出高电平,NP两端导通,被控制端导通,电压为0)->NPN正向三极管(gpio输出低电平,PN两端导通,被控制端导通,

    张飞实战电子官方
    04-30 18:40
    357

    TurMass™ vs LoRa:无线通讯模块的革命性突破

    TurMass™凭借其高传输速率、强大并发能力、双向传输、超强抗干扰能力、超远传输距离、全国产技术、灵活组网方案以及便捷开发等八大优势,在无线通讯领域展现出强大的竞争力。

    道生物联
    1天前
    529

    RZT2H CR52双核BOOT流程和例程代码分析

    RZT2H是多核处理器,启动时,需要一个“主核”先启动,然后主核根据规则,加载和启动其他内核。本文以T2H内部的CR52双核为例,说明T2H多核启动流程。

    RA生态工作室
    04-03 17:14
    2k

    干簧继电器在RF信号衰减中的应用与优势

    在电子测试领域,RF(射频)评估是不可或缺的一部分。无论是研发阶段的性能测试,还是生产环节的质量检测,RF测试设备都扮演着关键角色。然而,要实现精准的RF评估,测试设备需要一种特殊的电路——衰减电路。这些电路的作用是调整RF信号的强度,以便测试设备能够准确地评估RF组件和RF电路的各个方面。衰减器的挑战衰减器的核心功能是校准RF信号的强度。为了实现这一点,衰

    斯丹麦德电子
    04-30 11:33
    659

    ElfBoard嵌入式教育科普|ADC接口全面解析

    当代信息技术体系中,嵌入式系统接口作为数据交互的核心基础设施,构成了设备互联的神经中枢。基于标准化通信协议与接口规范的技术架构,实现了异构设备间的高效数据交换与智能化协同作业。本文选取模数转换接口ADC作为技术解析切入点,通过系统阐释其工作机理、性能特征及重要参数,为嵌入式学习者爱好者构建全维度接口技术认知框架。

    ElfBoard
    04-30 09:34
    367

    深入理解C语言:C语言循环控制

    在C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种

    合众恒跃
    04-29 18:49
    467

    第 21 届(顺德)家电电源与智能控制技术研讨会圆满落幕--其利天下斩获颇丰

    2025年4月25日,其利天下应大比特之邀出席第21届(顺德)家电电源与智能控制技术研讨会,已圆满落幕。一、演讲回顾我司研发总监冯建武先生在研讨会上发表了主题为《重新定义风扇驱动:一套算法兼容百种电机的有效磁链观测器方案》的演讲,介绍了我司研发自适应技术算法(简称),该方案搭载有效磁链观测器,适配百种电机类型,结合FOC算法可实现免调参稳定启动、低速静音控制

    其利天下技术
    04-28 19:29
    1.4k

    来自资深工程师对ELF 2开发板的产品测评

    来自资深工程师对ELF 2开发板的使用测评

    ElfBoard
    04-28 15:03
    505

    飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束

    飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!

    飞凌嵌入式
    04-28 13:57
    1.6k

    常用运放电路总结记录

    一、电压跟随器电压跟随器,电路图如下:电路分析:(本文所有的运放电路分析,V+表示运放同向输入端的电压,V-表示反向输入端的电压。)1.1电压跟随器反馈电阻需不需要?在上面的电压跟随器示例中,我画上了一个反馈电阻R99,大家在学习的运放的时候,可能很多地方也会提一下这个反馈电阻,很多地方会说可加可不加,效果一样。电阻需不需要加:但是本文这里个人建议使用电压跟

    张飞实战电子官方
    04-27 19:33
    587

    运放-运算放大器经典应用电路大全-应用电路大全-20种经典电路

    20种运放典型电路总结,电路图+公式1、运放的符号表示2、集成运算放大器的技术指标(1)开环差模电压放大倍数(开环增益)大Ao(Ad)=Vo/(V±V-)=107-1012倍;(2)共模抑制比高KCMRR=100db以上;(3)输入电阻大ri>1MW,有的可达100MW以上;(4)输出电阻小ro=几W-几十W3、集成运放分析方法(V+=V-虚短,ib-=ib

    张飞实战电子官方
    04-25 19:34
    433