【示例】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 --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

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

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

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

应用 | 行锁

行锁主要有两种类型:

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

常见SQL语句的行锁加锁情况:

image-20240328183142935

注意:

  • InnoDB的行锁是针对索引的,如果SQL操作的字段没有索引,则会从行锁升级为表锁
  • 产生行锁的条件有:是唯一索引查询;且查询记录存在。否则在RR隔离机制下,一定有间隙锁的使用存在。

概念 | 间隙锁&临键锁的区间判断规则

间隙锁和临键锁的锁区间有一定的判断规则,下面通过一个案例讲解这两种锁的区间判断规则:

暂时没有,后续总结吧


应用 | 行锁&间隙锁&临键锁

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

相关加锁规则可以总结如下:

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

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

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

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

  • 优化:在(非唯一普通)索引上进行等值查询,【向右遍历时的最后一个值不满足查询需求时,临键锁退化为间隙锁】感觉不是,但是还没考证

  • 一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。(MySQL 8 已经修复)

仅写出来,还不太清楚,后续再说。


关于间隙锁和临键锁的描述:

  • 间隙锁唯一目的就是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会组织另一个事务在同一间隙上采用间隙锁。
  • 临键锁的主要目的是为了避免幻读,如果把事务隔离级别降低到RC,临键锁也将失效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器工作原理与实践--HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络

前面两篇文章我们分析了HTTP/1和HTTP/2,在HTTP/2出现之前,开发者需要采取很多变通的方式来解决HTTP/1所存在的问题,不过HTTP/2在2018年就开始得到了大规模的应用,HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是使…

MySQL 修改数据

目录 数据插入-insert 不指定列名插入: 插入整行数据 格式: 多行数据插入 格式: 指定列名插入 插入1行 插入多行 更新字段-update 语法: 删除表 语法: 案例: 数据插入-insert INSERT 将数据行…

从IoTDB的发展回顾时序数据库演进史

面向工业物联网时代,以 IoTDB 为代表的时序数据库加速发展。 时序数据的主要产生来源之一是设备与传感器,具有监测点多、采样频率高、存储数据量大等多类不同于其他数据类型的特性,从而导致数据库在实现高通量写入、存储成本、实时查询等多个…

AI电影创作,AI影视创作全套完整课程

课程下载:https://download.csdn.net/download/m0_66047725/89064240 更多资源下载:关注我。 课程内容: 【试听课】AI发展的现状及对影视行业未来的影响.mp4 0【AI影视创作】流程与基本逻辑_1.mp4 1【AI基础课程】ChatGPT 注册安装流程.…

LinkedList部分底层源码分析

JDK版本为1.8.0_271&#xff0c;以插入和删除元素为例&#xff0c;LinkedList部分源码如下&#xff1a; //属性&#xff0c;底层结构为双向链表 transient Node<E> first; //记录第一个结点的位置 transient Node<E> last; //记录最后一个结点的尾元素 transient …

半透明进口特氟龙材质镊子可耐受强酸强碱腐蚀PFA镊子

PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#xff5e;&#xff0b;260℃&#xff09;、耐腐蚀、表面不粘性等特点&#xff0c;用于苛…

python--字符串对象和

1、找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数&#xff08;函数&#xff09; def Divisible_by_5_6(x:int)->list:arr[]for i in range(1,x1):if (i % 5 0 or i % 6 0 ):if i % 5 0 and i % 6 0:continue #利用continue跳过能被5和6整除的数else:a…

跟bug较劲的第n天,undefined === undefined

前情提要 场景复现 看到这张图片&#xff0c;有的同学也许不知道这个冷知识&#xff0c;分享一下&#xff0c;是因为我在开发过程中踩到的坑&#xff0c;花了三小时排查出问题的原因在这&#xff0c;你们说值不值。。。 我分享下我是怎么碰到的这个问题&#xff0c;下面看代码…

服务器安装完SqlServer远程电脑连接不了

1、将服务器的TCP/IP启用 2、重新启动服务 cmd输入services.msc

【数据结构与算法篇】双链表实现

【数据结构与算法篇】双链表实现&#xff08;近300行实现代码&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. List.h 头文件的声明 2. List.c 源文…

Python通过socket搭建一个web服务器

目录 01、源码 02、运行结果 03、小结 Socket是一种计算机网络通信的一种机制&#xff0c;它允许不同计算机或进程之间通过网络进行数据传输和通信。Socket可以被看作是不同计算机之间的数据传输通道&#xff0c;通过这个通道&#xff0c;计算机之间可以进行双向的数据传输。…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起&#xff0c;与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族&#xff0c;Ransomhub和Blackbasta恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。…

二百三十二、Kettle——修改MySQL中历史数据为当前系统日期并增量同步到ClickHouse中

一、目的 由于一些雷达死了但是又需要有数据进行展示&#xff0c;于是就把这些雷达的历史数据&#xff0c;修改日期为当前日期后&#xff0c;增量同步到ClickHouse中&#xff0c; 二、难点 1、获取当前日期&#xff0c;并且修改历史数据的create_time字段的日期部分 2、如果…

C语言之九九乘法表||素数||最小公倍数

一、九九乘法表 &#xff08;1&#xff09;思路 1、九九乘法表中存在三个变量&#xff0c;以 x1 ; x2 ; y 为例&#xff08;这里也可以使用两个变量&#xff0c;用x1和x2来表示y&#xff0c;方法一样&#xff09; 2、想好了变量之后&#xff0c;我们要想怎样将他实现呢&#x…

Excel/WPS超级处理器,提取汉字/字母/数字

在职场工作中&#xff0c;经常会遇到单元格中有汉字&#xff0c;数字&#xff0c;字母三者的自由组合&#xff0c;但往往只需要其中的一者&#xff0c;如何快速提取呢&#xff0c;超级处理器&#xff0c;提供了4个功能可选。 超级处理器下载与安装 1&#xff09;分离字符 将…

前端用 HTML5 + CSS3 + JavaScript,后端连接什么数据库更简单?

当前端使用 HTML5、CSS3 和 JavaScript 进行开发时&#xff0c;后端连接何种数据库是一个非常重要的问题&#xff0c;因为数据库的选择直接影响着后端代码的编写、数据存储与查询的效率以及系统的可维护性。 1. 关系型数据库&#xff08;SQL 数据库&#xff09;&#xff1a; …

水经微图IOS版5.2.0发布

随时随地&#xff0c;微图一下&#xff01; 水经微图&#xff08;简称“微图”&#xff09;IOS新版已上线。 在该版本中主要新增图层树节点排序功能、常规&#xff08;矩形、圆、椭圆、扇形&#xff09;绘制功能、地形夸张等主要功能。 当前版本 当前版本号为&#xff1a;5…

分类算法——sklearn转换器和估计器(一)

转换器&#xff08;特征工程的父类&#xff09; 实例化&#xff08;实例化的是一个转换器类&#xff08;Transformer&#xff09;&#xff09;调用fit_transform&#xff08;对于文档建立分类词频矩阵&#xff0c;不能同时调用&#xff09; 把特征工程的接口称之为转换器&…

mac配置Jmeter环境

mac配置Jmeter环境 一、安装jmeter二、Jmeter目录结构三、汉化Jmeter四、jmeter安装第三方插件 一、安装jmeter 第一步先自行配置好电脑的jdk环境 1、官网下载jar包 https://jmeter.apache.org/download_jmeter.cgi 2、解压到软件安装目录 3、启动Jmeter 启动方式1️⃣&#x…

OpenHarmony开发——CMake方式组织编译的库移植

概述 本文为OpenHarmony开发者提供一些组织编译形式比较常见&#xff08;CMakeLists、Makefile&#xff09;的三方库的移植指南&#xff0c;该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台&#xff0c;文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译…