MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录

  • 全局锁
  • 表级锁
    • 表锁(表级锁)
    • 元数据锁(MDL,Meta Data Lock,表级锁)
      • 元数据锁演示
        • 元数据锁兼容的情况
        • 元数据锁互相阻塞的情况
    • 意向锁(Intention lock,表级锁)
      • 意向锁分类
      • 意向锁演示:
        • 意向共享锁(**IS**)与表读锁是兼容的
        • 意向排他锁(**IX**)与表读锁、写锁都是互斥的
  • 行级锁
    • 行锁(Record-Lock)
      • 行锁的加锁情况
      • 行锁优化
    • 间隙锁(Gap-Lock)
      • A.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
        • 数据准备:
      • B. 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。
        • 数据准备
      • C. 索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。

全局锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL
句,已经更新操作的事务提交语句都将被阻塞

DML是Update,insert,delete语句,数据操纵语言
DDL是Alter,create,drop之类的语句,数据定义语言
DQL,是查询,数据查询语言

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导
    致主从延迟。

表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。
对于表级锁,主要分为以下三类:

  1. 表锁
  2. 元数据锁(meta data lock,MDL)
  3. 意向锁

表锁(表级锁)

表锁作用是把整张表锁住
对于表锁,分为两类:

  • 表共享读锁(read lock)
  • 表独占写锁(write lock)

读锁

在这里插入图片描述

在这里插入图片描述

写锁

在这里插入图片描述

在这里插入图片描述

结论: 读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。

元数据锁(MDL,Meta Data Lock,表级锁)

元数据说的是表结构,元数据锁是锁住了表结构的意思

MDL作用是防止DML和DDL语句冲突问题的

meta data lock , 元数据锁,简写MDL。
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

在这里插入图片描述
注意:这里Shared-Read和Shared-Write是兼容的!!只是Shared-Read/Shared-Write与Exclusive互斥!

元数据锁演示

元数据锁兼容的情况

当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ / SHARED_WRITE),之间是兼容的。
在这里插入图片描述
上图如何理解?左边的客户端开启事务,进行查询操作,开启Shared-Read锁,右边客户端进行查询和更新操作,开启了Shared-Read和Shared-Write锁,但是由于表级锁里面元数据读写锁是兼容的,因此不阻塞另外一个客户端的操作,是兼容的!!

元数据锁互相阻塞的情况

当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁(EXCLUSIVE),之间是互斥的。
左边客户端开启Shared-read元数据读锁,右边用到了Alter语句,Exclusive级别的排他锁,因此是互斥,会导致阻塞!!

在这里插入图片描述
下面这个语句可以查询看元数据锁的加锁情况。

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

刚开始只有performance-schema里面有元数据读锁
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

意向锁(Intention lock,表级锁)

规避行锁与表锁加锁时的冲突问题

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

意向锁应用场景是这样的:
假如我对表A的某一行执行更新,则需要对表A的这行加上行锁,然后假如我有一个线程来了,需要加表锁,那么我们还需要挨行的去检查每一行是否存在行锁,这十分憨批,如果我们设置一个类似于标志位flag,flag=0,无行锁,flag=1,有行锁,这就解决了!这个flag就是本章节提出的意向锁。每次来检查是否有意向锁,是否和表锁冲突就完事儿了!!

在这里插入图片描述
当客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
在这里插入图片描述
有了意向锁之后 :
客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
在这里插入图片描述
在这里插入图片描述

意向锁分类

  • 意向共享锁(IS): 由语句select … lock in share mode添加 。 与 表锁共享锁(read)兼容,与表锁排他锁(write)互斥。IS = Intention Select
  • 意向排他锁(IX): 由insert、update、delete、select…for update添加 。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。IX=Intention + X (X为Insert,Update,delete,…任意一个)

所以一旦Select 。。。locks in Shared mode,会存在IS和MDL的Shared-Read(元数据锁)

一旦事务提交了,意向共享锁、意向排他锁,都会自动释放

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema. data_locks;

意向锁演示:

意向共享锁(IS)与表读锁是兼容的

表锁与IS有可能冲突,表锁的LOCK READ与IS兼容,表锁的写锁与IX不兼容,互斥
在这里插入图片描述

意向排他锁(IX)与表读锁、写锁都是互斥的

IX与表锁的lock read,lock write都互斥!!
在这里插入图片描述

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

  1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
    在这里插入图片描述
  2. 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
    在这里插入图片描述
  3. 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持
    在这里插入图片描述

行锁(Record-Lock)

行级锁有行锁,间隙锁,临键锁三种类型。现在介绍其中的行锁
InnoDB实现了以下两种类型的行锁:

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。(注意S是行锁里面的共享锁,IS是意向锁里面的共享锁,S是行,IS是表,都是读的级别)
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。(IX是意向锁,表锁,X是行的排他锁,行级)
    在这里插入图片描述

行锁的加锁情况

常见的SQL语句,在执行时,所加的行锁如下:
在这里插入图片描述
FOR UPDATE是在SQL语句中显式使用排他锁,避免其他事务干扰
LOCK IN SHARE MODE是显式使用共享锁

行锁优化

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key锁进行搜索和索引扫描,以防止幻读。

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。 next-key锁(间隙锁+行锁) → \to 行锁

遍历的时候用索引扫描,又因为默认是使用next-key锁,因为你本身就是唯一的,还是等值查询,针对存在的记录查询,因此直接行锁就完事儿了

  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时 就会升级为表锁。
    next-key锁(间隙锁+行锁) → \to 表锁

(比如通过非索引字段查询并且查询的时候带上了锁,比如是行锁里面的排他锁or行锁里面的共享锁,除非你只Select,不加任何的锁)

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

PS:
注意一下有区别:

下面这个语句可以查询看元数据锁的加锁情况。

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks ;

一个是metadata_locks一个是data_locks,情况不一样!! ,而且Select出来的列名也是不一样!!

间隙锁(Gap-Lock)

间隙锁的作用防止多个事务并发时发生的幻读现象。

幻读
两次查询结果(两次读取结果)不一样就是幻读,为此,在可重复读,RR级别下,特此加入间隙锁,试图消除幻读现象,保证读1次和读2次,读99次结果都是一样的!!

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

如果这里是索引上的等值查询(唯一索引),给存在的记录加锁时, 优化为行锁 。又是前面讨论过的情况

  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
  • 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

更详细的间隙锁参考另外一篇文章:
https://blog.csdn.net/weixin_46028606/article/details/144471986?fromshare=blogdetail&sharetype=blogdetail&sharerId=144471986&sharerefer=PC&sharesource=weixin_46028606&sharefrom=from_link

A.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

数据准备:

DROP TABLE IF EXISTS `stu`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `stu` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int NOT NULL,PRIMARY KEY (`id`),KEY `idx_stu_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `stu`
--LOCK TABLES `stu` WRITE;
/*!40000 ALTER TABLE `stu` DISABLE KEYS */;
INSERT INTO `stu` VALUES (1,'tom',10),(3,'cat',30),(9,'rose',90),(11,'jetty',110),(19,'lily',190),(25,'luci',250);
/*!40000 ALTER TABLE `stu` ENABLE KEYS */;
UNLOCK TABLES;

X,GAP表示行锁+间隙锁,这俩加起来就是临键锁next-key锁。

在这里插入图片描述

B. 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。

数据准备
DROP TABLE IF EXISTS `hm1`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `hm1` (`id` int NOT NULL AUTO_INCREMENT,`num` int NOT NULL,PRIMARY KEY (`id`),KEY `num` (`num`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `hm1`
--LOCK TABLES `hm1` WRITE;
/*!40000 ALTER TABLE `hm1` DISABLE KEYS */;
INSERT INTO `hm1` VALUES (1,6),(2,12),(3,16),(40,18),(50,29);
/*!40000 ALTER TABLE `hm1` ENABLE KEYS */;
UNLOCK TABLES;

在这里插入图片描述
验证:
在这里插入图片描述
下图试图插入num=28的记录,被阻塞住了,还超时了
在这里插入图片描述

C. 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

图片水印挡住了+笔误了,字是锁住最后一个记录50和后面的(50,+∞)
在这里插入图片描述

学习资料:
通过网盘分享的文件:MySQL-进阶篇.pdf
链接: https://pan.baidu.com/s/1Wqryjq3JtB5FfP5_EULojw?pwd=e3mf 提取码: e3mf
–来自百度网盘超级会员v8的分享

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUG记录】Apifox 参数传入 + 号变成空格的 BUG

文章目录 1. 问题描述2. 原因2.1 编码2.2 解码 3. 解决方法 1. 问题描述 之前写了一个接口,用 Apifox 请求,参数传入一个 86 的电话,结果到服务器 就变成空格了。 Java 接收请求的接口: 2. 原因 2.1 编码 进行 URL 请求的…

51c视觉~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12088488 #PDD 西南交大&利兹大学等联合提出金字塔离散扩散模型(PDD),实现了3D户外场景生成的粗到细的策略 本文是对 ECCV 2024 Oral 文章Pyramid Diffusion for Fine 3D Large S…

strace跟踪的原理以及使用

如果想成为一名合格的工程师,那肯定应该知道如何去分析应用逻辑,对于如何优化应用代码提升系统性能也应该能有自己的一套经验。而今天想要讨论的是,如何拓展自己的边界,让自己能够分析代码之外的模块,以及对我自己而言…

Canoe CAPL编程

文章目录 CAPL 简介CAPL的程序结构CAPL的数据类型1. 无符号整数2. 有符号整数3. 有符号整数4. CAN消息类型5. 定时器类型6. 变量定义 on message xxx 中 this相关方法公共方法1. output(msgName) 从程序块输出message(形式1)或errorframe(形式…

详解CompletableFuture

最近一直畅游在RocketMQ的源码中,发现在RocketMQ中很多地方都使用到了CompletableFuture,所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture,并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。 Future接口以及它的…

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合,存储元素中key值唯一,每个key对应一个value。 LightWeightMap依据泛型定义,采用轻量级结构,初始默认容量大小为8,每次扩容大小为原始容量的两倍。 集合中k…

三极管功能

1 三极管的结构 2 三极管开关电路设计注意事项 1 三极管进入饱和状态 电机:500毫安 2 判断三级什么状态:电压法 3 判断三级什么状态:电流法 4 求IB的电阻 5 当三极管用作开关时,通常N型三极管控制负载的gnd端,P型…

P6打卡—Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.检查GPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvisiondevicetorch.device("cuda" if torch.cuda.is_…

R square 的计算方法和一点思考

模型的性能评价指标有几种方案:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score 其中,当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score&#xff1…

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时,调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误: Model inference er…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数,计算机不可能给出连续结果,可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

【进程篇】03.进程的概念与基本操作

一、进程的概念与理解 1.1 概念 进程是程序的一个执行实例,即正在执行的程序。 1.2 理解 我们编写代码运行后会在磁盘中会形成一个可执行程序,当我们运行这个可执行程序时,这个程序此时就会被操作系统的调度器加载到内存中;操…

基于MATLAB 的数字图像处理技术总结

大家好!欢迎来到本次的总结性的一篇文章,因为咸鱼哥这几个月是真的有点小忙(参加了点小比赛,准备考试等等)所以,在数字图像学习后,我来写一个总结性的文章,同时帮助大家学习&#xf…

llama2——微调lora,第一次参考教程实践完成包括训练和模型

前言:磕磕绊绊,不过收获很多,最大的收获就是解决报错error的分析方法和解决思路 1、首先,我参考的是这篇博客:怎样训练一个自己的大语言模型?全网最简单易懂的教程!_开源模型训练出一个语言模型…

类OCSP靶场-Kioptrix系列-Kioptrix Level 3

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录功能账号密码爆破 2.2.CMS历史漏洞 2.2.1.exp利用 2.2.2.提权 2.3. sql注入getshell 2.3.1.发现注入点 2.3.2. 测试字段和类型 2.3.3.查询字…

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示,函数曲线展示,实例:震动数据分析为例。 如上图所示,如果你想实现上图中的效果,请详细参考我的内容,创作不易,给个赞吧。 一共有两种方式来实现,一种是使用第三…

PHP代码审计学习(一)--命令注入

1、漏洞原理 参数用户可控&#xff0c;程序将用户可控的恶意参数通过php可执行命令的函数中运行导致。 2、示例代码 <?php echorec-test; $command ping -c 1 .$_GET[ip]; system($command); //system函数特性 执行结果会自动打印 ?> 通过示例代码可知通过system函…

Vivado安装System Generator不支持新版Matlab解决方法

目录 前言&#xff1a; Vivado安装System Generator不支持新版Matlab解决方法 前言&#xff1a; 本文介绍一下Vivado不支持新版Matlab的解决办法&#xff0c;Vivado只支持最近两年3个版本的Matlab&#xff0c;当前最新版vivado 2018.3只支持2017a,2017b,2018a。 Vivado安装Sy…

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述 在上一篇文章中&#xff0c;我们一起学习了STDF格式的文件&#xff0c;知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后&#xff0c;好比掌握了切入半导体行业的金钥匙。 从今天开始&#xff0c;我们一起来一步步地学习如何解构、熟…

#渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘02之权限漏洞挖掘技巧

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 权限相关漏洞 越权、未授权访问、oss、后台暴露、…