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

news2024/11/25 3:18:51

引言

本文是对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.coloradmin.cn/o/1604817.html

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

相关文章

【简单介绍下PostCSS】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

如何实现在 Windows 上运行 Linux 程序?

在Windows 上运行Linux程序是可以通过以下几种方法实现: 1.使用 Windows Subsystem for Linux (WSL): WSL是微软提供的功能&#xff0c;可以在Windows 10上运行一个完整的Linux系统。用户可以在Microsoft Store中安装所需的 在开始前我有一些资料&#xff0c;是我根据网友给的…

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

将百度网盘中数据集直接下载到服务器上

步骤&#xff1a; 1:下载安装bypy pip install bypybypy&#xff0c;是一个使用 python 编写的命令行百度网盘客户端 2:初始化 bypy info将这个链接复制到浏览器中打开 复制授权码&#xff0c;粘贴到服务器命令&#xff0c;回车 等待一会&#xff0c;会显示你云盘空间大小信…

【小白学机器学习14】确定零假设h0的技巧:先根据错误的严重程度确定第1类错误α,再确定零假设h0

目录 1 前言: 如何确定H0的逻辑思路 1.1 推导的原理 2 假设检验的2类错误 2.1 什么叫2类错误 2.2 这两类错误的计算公式 2.2.1 计算公式 2.2.2 第1类错误和第2类错误的特点 3 如何设计H0的一些例子和思考 3.1 很多书上的原则1&#xff1a;备择假设通常才是研究者最想证…

多高的学历才能轻松找到工作?这个热点有点扯吧~

先来唠唠 昨天刷脉脉的时候&#xff0c;热榜第一的内容吸引了我&#xff1a;多高的学历才能轻松找到工作&#xff1f; 现在这行情&#xff0c;不管多高得学历都很难说能轻松找到工作吧~ 评论区也有不少小伙伴发表自己的见解&#xff0c;比如&#xff1a; 学历固然是非常重要…

2D动画制作软件Moho Pro14 mac注册激活版

Moho Pro 14 for mac 是一款专业的2D动画制作软件。它具有强大的功能和工具&#xff0c;适用于动画制作师、插画师和设计师。 Moho Pro14 mac注册激活版下载 Moho Pro 14提供了丰富的动画功能&#xff0c;包括骨骼动画、形状插值、帧逐帧动画等。您可以使用骨骼工具来创建复杂的…

中缀表达式求值

题目 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 示例1 输入&#xff1a;“12” 返回值&#xff1a;3示例2 输入&#xff1a;“(2*(3-4))*5” 返回值&#xff1a;-10示例3 输入&#xff1a;“32*3*4-1” 返回值&#xff1a;26 思路 经典的中缀表达式求值。…

Ubuntu 20.04.06 PCL C++学习记录(二十六)

[TOC]PCL中点云配准模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 在代码中使用ICP迭代最近点算法&#xff0c;程序随机…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境ma…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

buuctf之ciscn_2019_c_1

ciscn_2019_c_1 一、查看属性二、静态分析三、动态分析四、思路五、exp 一、查看属性 首先还是必要的查看属性环节&#xff1a; 可以知道该文件是一个x86架构下的64位小端ELF文件&#xff0c;开启了栈不可执行&#xff08;NX&#xff09; 执行一下&#xff0c;先有一个选择&…

树莓派+Openwrt连接校园网,打破校园网设备限制

前言 因为本校学生校园网只允许最多三个设备登录&#xff0c;对于同时拥有多个联网设备的我十分不友好&#xff0c;而且大多单片机如esp32的wifi模块是只允许一般的WPA/WPA2认证的&#xff0c;是不支持校园网的portal认证。所以我决定搞一个路由器。 然后我上网买了一个TP-Li…

加密软件作用有哪些?迅软DSE加密系统满足企业防泄密需求

加密软件在保护个人隐私、商业机密、敏感数据等方面发挥着重要作用&#xff0c;为用户和组织提供了重要的安全保障措施。保护数据的安全性和隐私性。通过加密软件&#xff0c;用户可以对文件、图纸、文档、源代码等进行加密处理&#xff0c;使其变得不可读取&#xff0c;只有授…

java动态代理--JDK代理

1.概述 JDK动态代理&#xff1a;只能代理实现了接口的类&#xff0c;代理对象是实现了目标对象所有接口的代理类 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象&#xff0c;工作通过反射机制完成。 2.实现接口InvocationHandler …

37、Tomato(VulnHub)

Tomato 一、nmap 2211是ssh的端口&#xff0c;21的ftp也不是弱密码 二、web渗透 随便看看 目录爆破 /seclists/Discovery/Web-Content/common.txt /antibot_image/antibots/readme.txt 发现该站点存在反爬机制 /antibot_image/antibots/info.php 提示我们该网页存在个参数 GET&…

汇编语言——将DX,AX组成的32位数逻辑左移3位

data segment data ends stack segment stacktop label worddw 100 dup (?) stack ends code segmentassume cs:code,ds:data,ss:stack main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top;0000 0001 1100 1010 | 0000 0010 0001 1111;逻辑左移三位后&#xf…

VsCode调试远程服务器上面的Docker容器

第一步 VsCode 连接ssh 下载安装VsCode(Visual Studio Code)&#xff0c;首次安装会提示你安装Chinese(Simplified)中文简体&#xff0c;安装完后重新打开就是汉化界面了。在左边侧边栏找到扩展选项&#xff0c;然后安装Remote Development插件&#xff0c;里面包含了Remote S…