【示例】MySQL-MySQL中常见的锁

前言

本文主要讲述MySQL中常见的锁。

总结 | 各类别锁的名字

锁级别锁名字解释
全局锁read lock全局锁只有可读锁
表级锁 - 表锁read lock 表共享读锁
write lock 表独占写锁
表级锁 - 元数据锁(meta data lock,MDL)SHARED_READ_ONLY
SHARED_NO_READ_WRITE
SHARED_READ
SHARED_WRITE
EXCLUSIVE
表级锁 - 意向锁IS 意向共享锁
IX 意向排他锁
行级锁 - 行锁(Record Lock)S 共享锁
X 排他锁
行级锁 - 间隙锁(Gap Lock)Gap Lock
行级锁 - 临键锁(Next-Key Lock)Next-Key Lock

全局锁

概念 | 什么是全局锁?

什么是全局锁?

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

全局锁应用场景?

全数据库的数据备份。在这个场景下,需要对数据库整体加锁,然后进行数据备份。

如果不加锁进行数据备份,会使数据一致性得不到保证。

应用 | 全局锁存在的问题及解决?

全局锁语法

# 加全局锁
flush tables with read lock;# 进行相关操作# 释放全局锁-1:SQL语句
unlock tables;# 释放全局锁-2:关闭当前会话窗口

全局锁应用存在的问题

加了全局锁,整个数据库处于只读状态:业务正常的进展就会停滞。

如何解决该问题?

如果数据库的存储引擎支持可重复读的隔离级别,就能解决。原理是:

  • 在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
  • 因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read View,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。

mysqldump工具进行数据库备份

针对数据库全库备份这个情况,如果使用的备份数据库工具是 mysqldump,按如下用法即可:

mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql

加上 –single-transaction 参数的时候,就会在备份数据库之前先开启事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。

InnoDB 存储引擎默认的事务隔离级别正是可重复读,因此可以采用这种方式来备份数据库。但是对于 MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁的方法。

表级锁

概念 | 什么是表级锁

表级锁就是每次操作锁住整张表。锁定粒度较大,容易发生锁冲突,并发性能较低。在MyISAM、InnoDB、BDB引擎中都有应用。

对于表级锁,主要有三类:表锁、元数据锁、意向锁

应用 | 表锁

表锁主要有两类:

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

应用语法:

# 加锁
lock tables 表名 read;	# 表共享读锁
lock tables 表名 write;	# 表独占写锁# 释放锁-1:SQL语句
unlock tables;# 释放锁-2:关闭当前会话窗口

表锁的特点:

特点
表共享读锁:read lock事务A上锁。不影响事务B的读操作,但影响B的写操作
表独占写锁:write lock事务A上锁。既影响事务B的读操作,也影响B的写操作

应用 | 元数据锁

元数据锁,meta data lock,简称:MDL。元数据锁是表级锁,是对一张表加的锁。元数据锁加锁的过程是系统自动控制,无需显示调用。


元数据锁的作用主要是维护一张表元数据的一致性,在表上有事务的时候,不能对元数据进行写入操作。

理解一下上面这段话涉及到的概念:

  • 元数据:指一张表的表结构
  • 不能对元数据进行写入操作:就是说不能更改表的表机构,即DDL操作失效。

在一些常见的SQL语句中,系统自动加入的是不同的元数据锁,主要有如下几类:

SQL元数据锁的类型说明
lock tables xxx read 加表锁-表共享读锁SHARED_READ_ONLY可以叫:MDL读锁(共享),特点可以参照表共享读锁
lock tables xxx write 加表锁-表独占写锁SHARED_NO_READ_WRITE可以叫:MDL写锁(排他),特点可以参照表独占写锁
SELECT ... 常规查询语句,不加锁
SELECT ... lock in share mode 加行锁-共享锁
SHARED_READ与这两个元数据锁兼容:SHARED_READ、SHARED_WRITE
与这一个元数据锁互斥:EXCLUSIVE
INSERT ... 常规插入语句,加行锁-排他锁
UPDATE ... 常规更新语句,加行锁-排他锁
DELETE ... 常规删除语句,加行锁-排他锁
SELECT ... FOR UPDATE 加行锁-排他锁
SHARED_WRITE与这两个元数据锁兼容:SHARED_READ、SHARED_WRITE
与这一个元数据锁互斥:EXCLUSIVE
ALTER TABLE ...EXCLUSIVE与其他任意的元数据锁都互斥
  • 兼容:即两个用户访问同一张表,一个是上锁A,一个是上锁B。锁A和锁B兼容,A、B两用户的请求就不会相互阻塞
  • 互斥:解释同上,但是A、B两用户的请求会相互阻塞

应用 | 意向锁

意向锁是作用是为了避免在进行SQL-DML操作的时候,加的行锁与表锁产生冲突。意向锁也是系统控制的

在InnoDB中加入意向锁,使得表锁在上锁的时候不用检查每行数据是否加行锁,从而减少了表锁的检查操作。

  • 若没有意向锁:A对某一行加了行锁,B需要对该表加表锁,就需要判断每一行数据是否有锁,效率较慢。

  • 若是有了意向锁:A对某一行加了行锁,同时对该表加上意向锁,B锁需要对该表加表锁,通过是否有意向锁,就可以知道能否成功加锁,而不用遍历每一行数据


意向锁主要有如下两类:

SQL意向锁的类型说明
SELECT ... lock in share mode 加行锁-共享锁意向共享锁(IS)兼容:表锁-表锁共享锁
互斥:表锁-表锁排他锁
INSERT ... 常规插入语句,加行锁-排他锁
UPDATE ... 常规更新语句,加行锁-排他锁
DELETE ... 常规删除语句,加行锁-排他锁
SELECT ... FOR UPDATE 加行锁-排他锁
意向排他锁(IX)互斥:表锁-表锁共享锁、表锁-表锁排他锁

意向锁的主要特点有:

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

  • 意向锁之间不会互斥:即该表可以同时存在:意向共享锁、意向排他锁,这个时候,两个表锁类型的任意一个都不能成功上锁

  • 意向锁同元数据锁一样,不是主动加的,而是SQL操作后,系统会对应加上相应的意向锁。

总结 | 表锁、元数据锁、意向锁

三种表级锁,关键的是表锁。另外两个表级锁:元数据锁、意向锁,都是随着SQL语句的执行,自动添加的对应锁。

行级锁

概念 | 什么行级锁?

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

InnoDB引擎是基于索引组织的,行锁也是通过索引上锁的,而不是通过记录上锁,行级锁主要有如下三类:行锁、间隙锁、临键锁。


三种行级锁的图示:

  • 行锁(Record Lock):锁住单个行记录的数据,可防止其他事务对该数据进行:UPDATE、DELETE操作

image-20240328180623684

  • 间隙锁(Gap Lock):锁住索引记录间隙,不对行记录上锁,可防止其他事务对该数据进行:INSERT操作。用来防止幻读

image-20240328180847930

  • 临键锁(Next-Key Lock):行锁和间隙锁的组合,既锁住数据,又锁住间隙

image-20240328181441970


行锁的分类

行锁主要有两种类型:

  • 共享锁(S):允许其他事务对加了该锁的行记录进行读取,但不允许修改
  • 排他锁(X):不允许其他事务对加了该锁的行记录进行读取,也不允许修改
解释
共享锁兼容:共享锁
排斥:排他锁
排他锁排斥:共享锁、排他锁

三种行级锁的排斥、共享情况:

  • 行锁:有共享锁和排他锁之间的排斥、兼容规则

  • 间隙锁:不同间隙锁之间相互兼容。即使两个事务锁住同一个间隙,也是相互兼容的

  • 临键锁:组成是间隙锁 + 行锁,行锁之间是有排斥规则的。当获取到一个X型的临键锁,有范围重叠的临键锁是会互斥的

概念 | 行锁&间隙锁&临键锁的使用规则

相关应用示例,参考文章:小林Coding。文章里面关于加锁顺序的判断还是很直观明确的,赞!

下文为文章内容总结:

默认情况下,InnoDB引擎在RR事务隔离级别下运行,使用临键锁进行搜索和索引扫描,来防止幻读。而在某些情况下,临键锁会优化或者说退化为间隙锁/行锁。

在RR事务隔离级别下,相关加锁规则可以总结如下:

原则1:查找过程中访问到的对象才会加锁

原则2:加锁的基本单位是临键锁,其区间是前开后闭:(前开,后闭]


下面的优化原则,针对如下数据库记录进行验证:

image-20240413103330436

优化:在(唯一)索引上进行等值查询,如果这条记录存在,则将临键锁退化为行锁。

select * from user where id = 1 for update;

image-20240413103527397

优化:在(唯一)索引上进行等值查询,如果这条记录不存在,则将临键锁退化为间隙锁

select * from user where id = 2 for update;

image-20240413103820288

优化:在(唯一)索引上进行范围查询,加锁的范围视情况而定

  • 范围查询:>
select * from user where id > 15 for update;

image-20240413104124003

  • 范围查询:>=
select * from user where id >= 15 for update;

image-20240413104204725

  • 范围查询:< 并且条件值记录不存在
select * from user where id < 6 for update;

image-20240413104251830

  • 范围查询:<= 并且条件值记录存在
select * from user where id <= 5 for update;

image-20240413104706456

  • 范围查询:< 并且条件值的记录存在
select * from user where id < 5 for update;

image-20240413104822714

优化:在(非唯一)索引上进行等值查询,加锁的范围视情况而定

  • 等值查询,查询的值不存在
select * from user where age = 25 for update;

image-20240413105402360

  • 等值查询,查询的值存在
select * from user where age = 22 for update;

image-20240413105453164

优化:在(非唯一)索引上进行范围查询

select * from user where age >= 22  for update;

image-20240413105609858

概念 | 不同事务隔离级别下,行级锁的使用情况

不同事务隔离级别下,行级锁的使用情况:(总结不到位,边学边完善吧)

隔离级别是否会产生脏读是否会产生不可重复读是否会产生幻读行级锁支持
READ UNCOMMITTED,读未提交行锁
READ COMMITTED,读提交×行锁
REPEATABLE READ(MySQL默认隔离级别),可重复读××√(没有完全解决幻读)行锁、间隙锁、临键锁
SERIALIZABLE,串行化读×××行锁、临键锁

隔离级别从上到下,越来越高。隔离级别越高,数据越安全,性能越低。

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

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

相关文章

OSPF实验

需求&#xff1a; 1、R1-R3为区域0&#xff0c;R3到R4为区域1&#xff1b;其中R3的环回也在区域0&#xff0c;P1-R3分别有一个环回接口 2、R1-R3 R3为DR设备&#xff0c;没有BDR 3、R4环回地址已固定&#xff0c;其他所有网段使用192.168.1.0/24进行合理分配 4、R4环回不能…

【golang】动态生成微信小程序二维码实战下:golang 生成 小程序二维码图片 并通过s3协议上传到对象存储桶 | 腾讯云 cos

项目背景 在自研的系统&#xff0c;需要实现类似草料二维码的功能 将我们自己的小程序&#xff0c;通过代码生成相想要的小程序二维码 代码已经上传到 Github 需要的朋友可以自取 https://github.com/ctra-wang/wechat-mini-qrcode 一、生成Qrcode并提交到对象存储 通过源生A…

Kubernetes(k8s):深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

Kubernetes&#xff08;k8s&#xff09;&#xff1a;深入理解 Kubernetes 中的污点&#xff08;Taints&#xff09;与容忍度&#xff08;Tolerations&#xff09; 1、污点&#xff08;Taints&#xff09;2、容忍度&#xff08;Tolerations&#xff09;3、示例演示-测试污点的具…

【C/C++基础知识】const 关键字

文章目录 Q&A and 前言const 修饰基本变量初始化const 对象仅在文件内有效 const 的引用应用 指针与 constconst 修饰类成员函数参考写在最后 Q&A and 前言 Q&#xff1a;简要说一说 C 中的 const 关键字&#xff0c;含义以及常见的使用位置 A&#xff1a;const 是 C…

自动化测试(selenium篇)

这次我们来介绍selenium 我们主要来讲解这几个要点 1.什么是自动化测试 2.什么是selenium 3.为什么来讲selenium 4.selenium的环境搭建 5.selenium的 API 1.什么是自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条…

蓝宝石衬底材料具有广阔消费市场 行业景气度良好

蓝宝石衬底材料具有广阔消费市场 行业景气度良好 衬底是由半导体单晶材料制造而成的晶圆片&#xff0c;既可以直接进入晶圆制造环节生产半导体器件&#xff0c;也可以进行外延工艺加工生产外延片&#xff0c;是电子元件的主体结构和支撑载体。蓝宝石衬底材料具有良好的透光性、…

burpsuite最新版2024.3.1安装

burpsuite最新版安装 环境 windows jdk22 BurpLoaderKeygen.jar burpsuite profression 2024.3.1 链接 链接&#xff1a;https://pan.baidu.com/s/1N6nggZZezg8y1FHpgwJmeg 提取码&#xff1a;n6uqjdk以及破戒方式这里不做介绍 注意事项 使用BurpLoaderKeygen.jar 破解之后…

Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。

在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误&#xff0c;可能是由于以下几种原因&#xff1a; DNS 解析问题&#xff1a; 确保源域和目标域的DNS配置正确&#xff0c;能够互相解析对方的域名和IP地址。…

多语言婚恋交友APP开发流程一览

近年来&#xff0c;随着全球化的发展和人们对跨文化交流的需求增加&#xff0c;多语言婚恋交友APP的需求逐渐增长。开发这类APP需要考虑到不同语言和文化下用户的需求&#xff0c;涉及到一系列独特的流程和挑战。本文将从专家角度为您解析多语言婚恋交友APP的开发流程&#xff…

LeetCode105题:从前序与中序遍历构造二叉树(python3)

105题&#xff1a;从前序与中序遍历构造二叉树 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def buildT…

PCB工艺规范及PCB设计安规原则

一、目的 规范产品的PCB工艺设计&#xff0c;规定PCB工艺设计的相关参数&#xff0c;使得PCB的设计满足可生产性、可测试性、安规、EMC、EMI等的技术规范要求&#xff0c;在产品设计过程中构建产品的工艺、技术、质量、成本优势。 二、适用范围 本规范适用于所有电了产品的PCB工…

【Redis】redis面试相关积累

Redis到底是多线程还是单线程&#xff1f; Redis 在设计上是单线程的&#xff0c;这意味着 Redis 服务器在任何给定时刻只能执行一个命令。然而&#xff0c;这并不意味着 Redis 无法利用多核 CPU&#xff0c;因为 Redis 使用了一些技术来提高性能和并发性&#xff0c;例如非阻…

【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式

本插件可以使用蓝图获取到项目的一些基本配置&#xff0c;如获取&#xff1a;公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许…

【Vue3进阶】- 第2学堂小商城项目后端准备和接口文档

简介 在大多数前端项目开发中&#xff0c;都需要与后端进行接口交互&#xff0c;后端通常会以文档的形式提供接口信息&#xff0c;前端开发者通过阅读这些文档&#xff0c;了解后端接口的功能和使用方法&#xff0c;从而实现数据的获取和提交等功能。 第二学堂小商城教程后端…

03攻防世界-unserialize3

根据题目可以看出&#xff0c;这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码&#xff0c;那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题&#xff0c;根据源码提示我们需要构造code。 序列化的意思是&#xff1a;是将变量转换为可保存或传输…

嵌入式之数据结构篇(五)

五、数据结构与算法 程序 数据结构 算法 1.数组 数组是存放在连续空间上的相同类型数据集合 数组下标是从0开始的数组内存空间地址是连续的 二分查找&#xff1a;给定一个n个元素升序的整型数组nums和一个目标值target&#xff0c;写一个函数搜索nums中的target&#xf…

vue2 的版本 使用 Ant Design Vue 1.78版本的组件库 做自定义接口 调用后端的接口上传excel文件

话不多说 上代码 <a-upload style"margin-left: 8px" :before-upload"beforeUpload" :showUploadList"false" :multiple"false" :headers"tokenHeader" ><a-button> <a-icon type"upload" /> 导…

MongoDB爬虫:(某扑)实战

https://bbs.hupu.com/bxj网页地址: https://bbs.hupu.com/bxj 然后我们在网页上定义帖子名称、帖子链接、创建时间、回复数、最后回复用户...... 除此之外,我们发现虎扑步行街最多显示的页数(20): 、 当我们打开第3页的时候,网页的URL的地址变为了:https://bbs.hupu.…

构建你的AI未来:CentOS 7上的dlib Docker魔法

前言 在当今信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了现代科技领域的中流砥柱。在众多 AI 库中&#xff0c;dlib 凭借其强大的功能和广泛的应用领域逐渐崭露头角。dlib 是一个高度灵活且功能丰富的机器学习库&#xff0c;旨在提供各种工具和算…

vmware虚拟机进不去系统补救

更新了虚拟机里面工具和资料&#xff0c;进行了磁盘整理和压缩&#xff0c;虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施&#xff1a;利用DiskGenius.exe&#xff08;要用高版本不然复制的时候就知道了&#xff09; DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…