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),会导
致主从延迟。
表级锁
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。
对于表级锁,主要分为以下三类:
- 表锁
- 元数据锁(meta data lock,MDL)
- 意向锁
表锁(表级锁)
表锁作用是把整张表锁住
对于表锁,分为两类:
- 表共享读锁(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的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
- 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
- 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
- 临键锁(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的分享
相关文章:

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键
文章目录 全局锁表级锁表锁(表级锁)元数据锁(MDL,Meta Data Lock,表级锁)元数据锁演示元数据锁兼容的情况元数据锁互相阻塞的情况 意向锁(Intention lock,表级锁)意向锁分类意向锁演示:意向共享锁(**IS**)与…...

(四)Spring Cloud Alibaba 2023.x:高效构建 Gateway 网关服务
目录 前言 准备 项目集成 pom.xml引入依赖 启动类 yml文件添加网关配置 修改消费者FeignService类 结果验证 前言 Spring cloud alibaba 体系中构建微服务,我们使用Spring Cloud Gateway 作为服务网关, Gateway是Spring 官方推出的一款基于 Web…...

Android XR 是什么?解释它的功能、设备、开发工具等
什么是“Android XR”? Android XR是最新配备AI的OS(操作系统),兼容耳机和眼镜(AR眼镜)。 沉浸式剧场 从视频列表中选择... 您可以体验完全身临其境的视频观看体验。 无限工作空间 您的现实世界将成为您…...

【算法】实体关系抽取
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

Codeforces Round 993 (Div. 4)题解
A. Easy Problem 思路:经过看了一眼,我们发现,ab的和一定是n,且两个都是正整数, 所以a的范围就是从1~n-1 所以输出n-1即可 #include<bits/stdc.h> using namespace std; #define int long long int t; int n…...

【计算机网络】期末考试预习复习|中
作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备,转发器、网桥、路由器和网关有何区别? (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…...

从零用java实现 小红书 springboot vue uniapp (4)个人主页优化
前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了详情页开发 今天我们具体的去进行实现个人中心 并且分享我开发时遇到的问题 首先先看效果 我们对布局整体规划一下 个人名片 半透明背景 刚开始我用的是 <view style"background-image: ur…...

为“行车大脑”降温:Simdroid-EC助力汽车ECU设计研发
ECU(Electronic Control Unit,电子控制单元)被誉为汽车的行车大脑,在工作时会产生大量的热量,而其散热存在以下难题:一是工作环境恶劣,ECU常处于高温环境中;二是ECU所处的空间较为狭…...

视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案
数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势,主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限,例如只能进行现场监视,报警信息传输简单,无法远距离传输视频信号&…...

通过解调使用正则化相位跟踪技术进行相位解包裹
1. 绪论 光学计量学通常使用光学干涉仪来测量各种物理量。1,2 根据应用的不同,可以使用多种类型的干涉仪,但它们的共同目标是产生一个由被测物理量调制的条纹图案。使用这种光束编码程序可以检测到的物理量范围非常广:深度测量、应变分析、温…...

VMware替代 | 双一流大学采用ZStack ZSphere虚拟化平台加速医学应用算法分析
某双一流大学医学部在面对日益增长的医学应用算法分析需求时,选择采用ZStack ZSphere虚拟化平台,以满足其高性能计算和GPU业务应用的迫切需求。该平台凭借其轻量化、卓越性能及易用性,成功解决了医学部在虚拟化及GPU应用场景中的挑战。随着平…...

UNIAPP框架uView初步集成与开发设计
uView UI,是uni-app生态最优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。本文章分享UNIAPP集成使用uView页面动态开发设计。 一、使用HBuilder X 直接导入插件,下载后重启 uView - DCloud 插件市场 二、配置样…...

C05S08-LVS负载均衡
一、LVS 1. LVS概述 LVS(Linux Virtual Server、Linux虚拟服务)是一种基于Linux系统集群的负载均衡方案,属于四层的负载均衡。 集群:将相同组件部署在不同的服务器上,提供统一的服务,以及同样的功能&…...

C 语言代码诗韵:数字功能的雅集华章
函数基本操作练习 主要内容: 本任务主要练习函数的申请、定义、调用等,主要包含以下功能: 1)编写函数,输入一个整数,求各个数字之和; 2)编写函数,计算1!2&…...

ps案例制作
宣传海报 暖色调海报商品展示图...

【C++】列表初始化、声明、范围for、array容器
列表初始化、声明、范围for、array容器 一、统一的列表初始化1.1 使用{ }初始化1.2 initializer_list容器 二、声明2.1 auto关键字2.2 decltype关键字2.3 nullptr关键字 三、范围for四、array容器和forward_list容器 一、统一的列表初始化 1.1 使用{ }初始化 在C98中…...

C++智能指针详解
一、智能指针简介 智能指针是一个类似于指针的类,将指针交给这个类对象进行管理,我们就可以像使用指针一样使用这个类,并且它会自动释放资源。 智能指针运用了 RAII 的思想(资源获得即初始化)。RAII 是指,用对象的生命周期来管理资…...

基础库正则表达式
我们已经可以用requests 库来获取网页的源代码,得到 HTML 代码。但我们真正想要的数据是包含在 HTML代码之中的,要怎样才能从 HTML,代码中获取想要的信息呢?正则表达式就是其中一个有效的方法。 本篇博客我们将了解一下正则表达式的相关用法。正则表达…...

【spring专题】spring如何解析配置类和扫描包路径
文章目录 目标重要的组件加载配置类启动解析组件定位配置类解析配置类 扫描过程总结 目标 这是我们使用注解方式启动spring容器的核心代码 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(MyConfig.class); User user (Us…...

MyBatis框架的入门
目录 MyBatis第一章:框架的概述1. MyBatis框架的概述 第二章:MyBatis的入门程序1. 创建数据库和表结构2. MyBatis的入门步骤 MyBatis 第一章:框架的概述 1. MyBatis框架的概述 MyBatis是一个优秀的基于Java的持久层框架,内部对…...

代码随想录D22-23 回溯算法01-02 Python
理论回顾 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。 回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝…...

【网络云计算】2024第50周-每日【2024/12/13】小测-理论-写10个Bash Shell脚本-解析
文章目录 1. 计算1到100的和2. 列出当前目录下所有文件和文件夹3. 检查文件是否存在4. 备份文件到指定目录(简单示例)5. 打印系统当前日期和时间6. 统计文件中的行数7. 批量重命名文件(将.txt后缀改为.bak)8. 查找进程并杀死&…...

MATLAB转换C语言--问题(一)FFT 和 IFFT 的缩放因子
1. MATLAB 中的 FFT 和 IFFT 在 MATLAB 中,fft 和 ifft 函数具有以下缩放行为: fft:执行快速傅里叶变换(FFT),不进行缩放。ifft:执行逆快速傅里叶变换(IFFT),…...

轻松上手:使用 Vercel 部署 HTML 页面教程
😀 在学习前端的过程中,部署项目往往是一个令人头疼的问题。然而,Vercel 为我们提供了一个便捷且免费的解决方案。 Vercel 是一个强大的云平台,专门用于前端项目的部署和托管。它不仅支持多种前端框架和静态网站生成器࿰…...

如何运用 HTM?
一、HTM 概述 HTM(Hierarchical Temporal Memory,分层时序记忆)是一种基于神经科学原理构建的计算模型,旨在模拟大脑的学习和记忆机制,以处理复杂的时间序列数据和模式识别任务。它具有独特的架构和算法,能…...

12.16【net】【study】
路由表是路由器或者其他互联网网络设备上存储的一张表,它记录了到达特定网络目的地的路径。路由表中的每一行(即一个路由条目)包含了目的地网络地址、子网掩码、下一跳地址、出接口等信息。 Destinations(目的地)和 R…...

2023和2024历年美赛数学建模赛题,算法模型分析!
文末获取历年优秀论文解析,可交流解答 2023年题目分析 MCM(Mathematical Contest in Modeling) 问题 A:遭受旱灾的植物群落 概述:要求建立预测模型,模拟植物群落在干旱和降水充裕条件下随时间的变化。类…...

Node.js内置模块
1.内置模块 Node.js的中文网参考手册:https://nodejs.cn//api 帮助文档 API文档:查看对应的模块,左边是模块,右边是模块的成员 源码:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 创建web服务器的模块 -->进入源码中,搜索…...

测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略
携程集团社招入职测评北森题库主要考察以下几个方面: 1. **言语理解**:这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**:包括文字题和图表题,考察应聘者快速找出关键信息…...

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统
Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…...