MySQL表级锁——技术深度+1

引言

本文是对MySQL表级锁的学习,MySQL一直停留在会用的阶段,需要弄清楚锁和事务的原理并DEBUG查看。

PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取,欢迎Star!

MySQL表级锁

MySQL中表级锁主要有表锁(注意区分表级锁)、意向锁、自增锁、元数据锁。

语法

lock tables test.t1 read, test.t2 write;unlock tables;

可以对同一个表同时加读锁,但是不能同时加写锁,或者混合读写锁。

DML,DDL以及DCL是什么?

  • DML(data manipulation language)是数据操纵语言:它们是UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。
  • DQL(data query language) 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块。
  • DDL(data definition language)是数据定义语言:DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
  • DCL(data control language)是数据库控制语言:是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。

元数据(MDL)锁

元数据锁(Metadata Lock,简称MDL)是表级锁中的一种,MDL锁主要作用是维护表元数据的数据一致性,为了避免DML与DDL冲突,保证读写的正确性。元数据锁不仅仅可以应用到表上,也可以应用到schemas、存储过程、函数、触发器、计划事件、表空间上。

DDL,DML,DQL, 表级锁都会加元数据锁。隐式加解锁,无需用户控制,系统自动完成。

查看元数据锁

select * from performance_schema.metadata_locks;

请添加图片描述

因为查询了metadata_locks,所以系统自动加了元数据锁。

MDL类型

类型

  • 共享只读SHARED_READ_ONLY
  • 共享写锁SHARED_NO_READ_WRITE
  • 共享读锁SHARED_READ
  • 共享写锁SHARED_WRITE
  • 排他锁EXCLUSIVE

共享读锁SHARED_READ和共享写锁SHARE_WRITE是兼容的,跟排他锁EXCLUSIVE是互斥的。

SHARED_NO_READ_WRITE,SHARED_WRITE 有什么区别

  • SHARED_NO_READ_WRITE: 表示共享资源不可读写,即多个进程可以共享资源,但不能对其进行读写操作。
  • SHARED_WRITE: 表示共享资源可写,即多个进程可以共享资源,并且可以对其进行写操作。

不同的DQL加元数据锁的类型

  • SELECT..., SELECT FOR SHARE -> SHARED_READ;
  • SELECT... FOR UPDATE -> SHARED_WRITE;

表锁加元数据锁的类型

加表级读锁的时候,系统会自动创建一个共享MDL读锁
请添加图片描述
加表级写锁的时候,系统会自动创建一个MDL写锁(SHARED_NO_READ_WRITE)。
请添加图片描述

DML加元数据锁的类型

INSERT,UPDATE,DELETE的时候,系统会自动创建一个MDL写锁(SHARED_WRITE)。

DDL加元数据锁的类型

对于DDL语句,系统会自动加上MDL排他锁(EXCLUSIVE),此排他锁会阻塞所有的DQL、DML以及其他的DML。

总结

SQLType兼容性
SELECT, SELECT…FOR SHARESHARED_READ与SHARED_READ和SHARED_WRITE兼容,与EXCLUSIVE互斥
INSERT, UPDATE, DELETE, SELECT FOR UPDATESHARED_WRITE与SHARED_READ和SHARED_WRITE兼容,与EXCLUSIVE互斥
DDLEXCLUSIVESHARED_READ_ONLY与SHARED_READ兼容,与SHARED_WRITE互斥; SHARED_NO_READ_WRITE与SHARED_READ_ONLY 和SHARED_WRITE都互斥
LOCK TABLES READ/WRITESHARED_READ_ONLY/SHARED_NO_READ_WRITE与所有MDL锁互斥。

意向锁

意向锁是另外一种表级锁,为了避免DML语句在执行的时候行锁与表锁冲突而设计的意向锁,通过意向锁使得在加表锁的时候无需检查每行数据是否加锁。

举例

假设如下表:

IDName
1liubei
2caocao
3sunquan

ID=3被加上了行锁,此时如果想给表加上表级锁,就需要循环这个表记录,对于上述表需要扫描3次才能获取到表内数据锁情况。

MySQL设计:在执行DML的时候,同时给表加上一个意向锁,如果在加表级锁的时候,发现有意向锁,就可以根据策略决定是否能够加锁,则无需再扫描表数据了。

意向锁加锁方式

是一种隐式锁,由MySQL自己控制。

案例

执行select * from t1 where id <= '110101190007287516' for share;后观察锁的情况;
请添加图片描述

观察到存在lock_type=table的IS锁。(其中S代表着共享锁,X代表着排他锁,GAP代表着间隔锁等)

DML所加的意向锁都是IX锁(意向排他锁)

执行select * from t1 where id < '110101190007287516' for update;后观察锁的情况;

请添加图片描述

观察到存在lock_type=table的IX锁。(其中S代表着共享锁,X代表着排他锁,GAP代表着间隔锁等)

总结

Lock TypeDescription
IS意向共享锁与表读锁兼容,与写锁是排斥的
IX意向排他锁与表锁(无论是读锁还是写锁)都是互斥的

自增锁

自增锁是表级锁的一种,是一种隐式锁,唯一的用处就是保证自动主键的数据一致性、准确性。

补充

查看MySQL表锁

SHOW OPEN TABLES WHERE In_use > 0;

查看MySQL行锁或意向锁

SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME, LOCK_TYPE, LOCK_MODE, LOCK_STATUS, LOCK_DATA FROM performance_schema.data_locks;

参考资料

  • https://book.douban.com/subject/35231266/
  • https://juejin.cn/post/7260070602613456957
  • https://juejin.cn/post/7170707711208718344

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

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

相关文章

【Java EE】 SpringBoot配置文件

文章目录 &#x1f340;配置文件的作用&#x1f334;SpringBoot配置文件&#x1f343;配置文件的格式&#x1f333;properties 配置文件说明&#x1f338;properties基本语法&#x1f338;读取配置文件&#x1f338;properties 缺点分析 &#x1f332;yml 配置文件说明&#x1…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

附近商户-GEO数据结构的基本用法

10、附近商户 10.1、附近商户-GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a…

SpringBoot Bean管理(扫描、注册、注册条件)

Bean扫描 一般的扫描包路径 需要使用xml标签或者是ComponentScan(basePackages “xxx.xxx”) ,但是在SpringBoot中不需要。 在springBoot 项目的启动类中有一个注解&#xff1a;SpringBootApplication,这个注解包含以下注解&#xff1a; 但是ComponentScan并没有指明包路径…

开源协议的对比和商业上的安全使用

开源协议的对比和商业上的安全使用 开源组件是&#xff1a;“任何人都可以自由使用、更改和共享&#xff08;以修改或未修改的形式&#xff09;的软件”。当今企业依靠开源来加速开发、降低成本和推动创新。对开放源码的糟糕管理可能会使组织面临安全、法律和操作风险。 使用…

Maven基础篇5

私服 私服目的&#xff0c;方便公司内计算机通信&#xff0c;方便程序员们开发时资源互换&#xff1b; 1.Nexus私服 https://help.sonatype.com/repomanager3/download 可下载&#xff0c;第一个是服务器&#xff0c;第二个是工作空间 bin中有可执行命令 nexus.exe/run端口…

比亚迪唐EV和唐DM-p荣耀版上市,成为新能源汽车市场中的佼佼者!

随着环保理念的深入人心&#xff0c;新能源汽车市场正迎来前所未有的发展机遇。在这个变革的浪潮中&#xff0c;唐EV和唐DM-p荣耀版的上市无疑为市场注入了新的活力。它们凭借先进的技术、卓越的性能以及豪华配置&#xff0c;成为了新能源汽车市场中的佼佼者。然而&#xff0c;…

【飞桨AI实战】人体姿态估计:零基础入门,从模型训练到应用开发

前言 本次分享将带领大家从 0 到 1 完成一个人体姿态估计任务&#xff0c;覆盖数据准备、模型训练、推理部署和应用开发的全流程&#xff0c;项目将采用以PaddlePaddle为核心的飞桨深度学习框架进行开发&#xff0c;并总结开发过程中踩过的一些坑&#xff0c;希望能为有类似项…

增加PyQt5界面的交通流量预测(模型为CNN_GRU,CNN_BiGRU_ATTENTION,LSTM,Python代码)

1.效果视频&#xff1a;增加PyQt5界面的交通流量预测&#xff08;模型为CNN_GRU&#xff0c;CNN_BiGRU_ATTENTION&#xff0c;LSTM&#xff09;_哔哩哔哩_bilibili&#xff09; 2.三个模型和数据集的介绍 交通流量预测(python代码&#xff0c;压缩包中带有数据&#xff0c;CN…

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion 基于函数计算FC2.0部署AI数字绘画stable-diffusion基于函数计算FC3.0部署AI数字绘画stable-diffusion总结 在经过了上一次曲线救国失败经历之后&#xff0c;失败经历参考博文&#xff1a;https://developer.aliyun.c…

docker-003镜像制作

步骤 使用docker commit提交容器使之成为镜像以ubuntu安装vim后的容器为例 1 ubuntu安装vim 启动容器 docker run -it --nameubuntu-vim ubuntu /bin/bash安装vim apt-get update apt-get install vim2 提交容器作为镜像 查看容器 docker ps -a提交容器作为镜像 命令格式&…

SimManager助力巴西航空工业公司搭建功能完善的仿真平台

巴西航空工业公司在实施构建结构分析平台之前&#xff0c;使用内部作业调度批处理程序在大型计算机上进行求解作业&#xff0c;前处理器和后处理器在本地工作站上运行&#xff0c;这些程序生成的工程数据存储在共享网络目录中&#xff0c;这一过程带来了一些问题&#xff1a; 为…

STM32 MPU配置参数

TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强&#xff08;TEX - C - B- S&#xff09;. #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 &#xff…

C语言 | Leetcode C语言题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; int firstMissingPositive(int* nums, int numsSize) {for (int i 0; i < numsSize; i) {while (nums[i] > 0 && nums[i] < numsSize &&nums[nums[i] - 1] ! nums[i]) {int t nums[nums[i] - 1];nums[nums[i] -…

【办公类-26-01】20240422 UIBOT网络教研(自动登录并退出多个账号,半自动半人工)

作品展示&#xff1a; 背景需求&#xff1a; 每学期有多次网络教研 因为我有历任搭档的进修编号和登录密码&#xff0c; 所以每次学习时&#xff0c;我会把历任搭档的任务也批量完成。 但是每次登录都要从EXCEL里复制一位老师的“进修编号”“密码”&#xff0c;还要点击多次…

慧明咨询:成绩公式,发现未知,助力进步

在当今社会,数以万计的学子面临着激烈的教育竞争。2000万的中考生、1000万的高考生、300万的考研生以及500万的国考备考者,都在为了通过这“独木桥”而战。 面对有限的优质学区、师资力量的不足、以及巨大的心理压力,学生及其家长们焦虑不已。为此,深圳市慧明咨询顾问有限公司…

[Meachines][Medium]IClean

Main $ nmap -p- -sC -sV 10.10.11.12 -Pn --min-rate 1000 $ echo "10.10.11.12 capiclean.htb">>/etc/hosts 这题可能和python的SSTI有关 $ gobuster dir --url "http://capiclean.htb" --wordlist /usr/share/seclists/Discovery/Web-Content/c…

SpringMvc(2)RequestMapping注解

RequestMapping注解 1 、RequestMapping的作用2、RequestMapping的出现位置3、类上与方法上结合使用4、RequestMapping注解的value属性4.1 value属性的使用4.2 Ant风格的value4.3 value中的占位符&#xff08;重点&#xff09; 5、RequestMapping注解的method属性5.2衍生Mappin…

二维码图片的链接怎么提取?在线获取解码链接的方法

随着现在二维码成为内容展示的主要用途&#xff0c;很多场景下都会需要通过扫码的方式在手机上获取内容。那么在遇到无法扫码的情况时&#xff0c;可以通过提取二维码短链接来访问内容&#xff0c;点击链接跳转到对应的内容页面。 二维码链接想要快速的提取出来&#xff0c;最…

(二)Go的Mysql、Redis、Cookie、Logger等的文件配置

初始化配置 文章目录 初始化配置一、配置yaml文件二、Go读取配置文件三、初始化日志Logger四、初始化数据库&#xff08;MySQL或SqlLite&#xff09;五、初始化缓存&#xff08;Redis&#xff09;六、中间件服务&#xff08;middleware&#xff09; 一、配置yaml文件 Server:M…