MySQL高级----详细介绍MySQL中的锁

概述

锁是计算机协调多个进程或线程并发访问某一资源的机制,为了解决数据访问的一致性和有效性问题。在数据库中,除传统的计算资源(CPU、RAN、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

分类 

MySQL中的锁,按照锁的粒度分,分为以下三类:

1.全局锁:锁定数据库中的所有表。对整个数据库实例加锁,加锁后整个实例就处于只读状态。性能较差,数据逻辑备份时使用。

2.表级锁:每次操作锁住整张表。操作锁住整张表,锁定粒度大,发生锁冲突的概率高。

3.行级锁:每次操作锁住对应的行数据。操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低。

而对性能而言,锁的粒度越小,性能越好。

查看一个MySQL中正在使用的锁的语句:

SELECT object_schema, object_name, index_name, lock_type, lock_mode, lock_data
FROM performance_schema.data_locks;

有关数据库语句的一些前置要点

  1. DDL - Data Definition Language(数据定义语言)

    • 用于定义和管理数据库的结构,包括创建、修改和删除数据库、表、索引等。
    • 示例命令:CREATEALTERDROP
  2. DML - Data Manipulation Language(数据操纵语言)

    • 用于对数据库中的数据进行增加、修改、删除操作。
    • 示例命令:INSERTUPDATEDELETE
  3. DQL - Data Query Language(数据查询语言)

    • 用于查询数据库中的数据。
    • 示例命令:SELECT
  4. DCL - Data Control Language(数据控制语言)

    • 用于定义数据库的安全策略和访问权限。
    • 示例命令:GRANTREVOKE

全局锁

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

其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

这样获取的备份数据是没有办法保证数据的一致性的,因为在执行备份过程的时候仍然有业务在写入数据,比如在备份完tb_stock后又有新的业务执行,导致扣减了库存,tb_order表生成了订单数据等。 

加上全局锁的命令:

flush tables with read lock;

数据库备份命令(注意这不是一个SQL语句,需要在当前操作系统的命令行中执行即可):

mysqldump -h127.XXX.XXX.XXX -uroot -p密码 数据库名称 > xxx.sql

-h后要跟主机的ip。 

解开全局锁的命令:

unlock tables;

特点 

数据库中加全局锁,是一个比较重的操作,存在以下问题:

1.如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。

2.如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
在InnoDB引擎中,我们可以在备份时加上参数--single-transaction 参数来完成不加锁的一致性数据备份。(实际上InnoDB的底层是通过快照进行实现的)

表级锁

介绍:表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。

分类

对于表级锁,主要分为以下三类:

1.表锁

对于表锁,又可以分为两类:

表共享读锁(读锁)

当加了读锁后,不会整张表的数据只能进行读操作,不能进行写操作,其他客户端同样只能进行读操作而不能进行写操作。 

表独占写锁 (写锁)

而加了写锁后,在加锁的那个客户端可以进行读操作和写操作,但是在其他客户端无论读写操作都无法进行且将会被阻塞。当锁释放后则其他客户端的DQL和DDL/DML则会执行。 

总结:读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,也会阻塞其他客户端的写操作。

加锁:

lock tables表名... read/write。

释放锁:

unlock tables/客户端断开连接。
2.元数据锁( meta data lock,MDL)

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。(即如果一张表内有未提交的事务,不可以对元数据进行写入操作)。目的是为了避免DML与DDL冲突,保证读写的正确性。
在My5QL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

3.意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

1.意向共享锁(IS):由语句select ... lock in share mode添加。与表锁共享锁(read)兼容,与表锁排它锁( write)互斥。
2.意向排他锁(IX):由insert、update、delete、select ... for update添加。与表锁共享锁( read)及排它锁( write)都互斥。意向锁之间不会互斥。 

行级锁

介绍:行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类。
行锁(Record Lock)
锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。


2.间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,,产生幻读。在RR隔离级别下都支持。间隙锁锁的是间隙,不包含数据记录。

3.临键锁(Next-Key Lock)︰行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。 临键锁即会锁当前的记录也会锁住间隙。

默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。 
1.索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
2.索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
3.索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。
注意:间隙锁唯一目的是防止其他事务插入间隙防止幻读现象。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

InnoDB实现了以下两种类型的行锁:

1.共享锁(S)︰允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。(即共享锁和共享锁之间是兼容的,共享锁和排他锁之间是不兼容的)。

2.排他锁(X)∶允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁(即如果一个事务获取到了这行数据的排他锁,那么他可以更新数据,其他的事务不能获取这行数据的共享锁和排他锁)。

即在InnoDB引擎中两种锁的兼容情况如下:

日常常见的SQL语句对应所加的行锁类型(重点): 

1.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
2. InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据时,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。 

 

 

 

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

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

相关文章

U盘非安全退出后的格式化危机与高效恢复策略

在数字化时代,U盘作为数据存储与传输的重要工具,其数据安全备受关注。然而,一个常见的操作失误——U盘没有安全退出便直接拔出,随后再插入时却遭遇“需要格式化”的提示,这不仅让用户措手不及,更可能意味着…

vs code格式化

目录 vs code格式化 函数参数不换行 禁止 pylance 插件自动添加 import vs code格式化 函数参数不换行 def generate_canvas_box(self,corners,idxs,thickness2,data_idxNone,debug False): 方法四:使用 VS Code 的自定义格式化设置 打开 VS Code 设置&#xff…

【软考】SSH

目录 1. 说明2.特点2.1 安全性2.2 灵活性2.3 功能性2.3 易用性 3. 工作原理 1. 说明 1.Secure Shell。2.是一种加密的网络协议,用于安全地访问远程计算机或服务器。3.SSH提供了加密的通道,使得用户可以通过这个通道在本地计算机和远程计算机之间安全地传…

vivado DCI_CASCADE、DELAY_BYPASS

DCI_CASCADE DCI_CASCADE定义了一组高性能(HP)之间的主从关系 I/O银行。数字控制阻抗(DCI)参考电压从 主I/O库到从I/O库。 DCI_CASCADE指定哪些相邻库使用DCI级联功能,从而共享 具有主组的参考电阻器。如果同一I/O组列…

【无标题】AMAZINGIC晶焱科技:汽车电子 EOS 测试与防护

因牵涉到人身安全且需确保车辆正常行驶,车用产品的测试条件会比一般消费性产品还要严苛许多,大部分采用的EMC测试法规都是车载专用标准,因此汽车电子的验证几乎是独立于其他领域的。本文将集成晶焱科技深耕车用市场的经验,探讨汽车…

Spring Boot应用使用GraalVM本地编译相关配置

1. 介绍 Java应用程序可以通过Graalvm Native Image提前编译生成与本地机器相关的可执行文件。与在JVM执行java程序相比,Native Image占用内存更小和启动速度更快。 从spring boot3开始支持GraalVM Native Image,因此要使用此特性,需要把sp…

count(1)和count(*)和count(field)的区别

1.COUNT(*) 计算所有行的数量,包括那些含有 NULL 值的行。 它是最全面的计数方法,因为它不需要访问任何具体的列数据,只是简单地计算行数。 在大多数情况下,COUNT(*) 是最快的,尤其是在使用索引的情况下,…

大气热力学(3)——干空气与湿空气

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 3.0 本文所用符号一览3.1 干空气与湿空气的概念3.2 干空气的状态…

kubeadm快速部署k8s集群

文章目录 Kubernetes简介1、k8s集群环境2、linux实验环境初始化【所有节点】3、安装docker容器引擎【所有节点】4、安装cri-dockerd【所有节点】5、安装 kubeadm、kubelet、kubectl【所有节点】6、部署 k8s master 节点【master节点】7、加入k8s Node 节点【node节点】8、部署容…

【JavaWeb程序设计】JSP访问数据库

目录 一、安装Mysql,设置好数据库的账户和密码 二、JSP访问数据库的步骤 ①加载数据库驱动程序; ②建立连接对象; ③创建语句对象; ④获得结果集; ⑤关闭有关连接对象。 三、实现个人信息的查询和展示 1、新增…

Week 5-杨帆-学习总结

目录 46 语义分割和数据集语义分割与其他技术的区别Pascal VOC2012 语义分割数据集数据预处理自定义语义分割数据集类数据加载与批量处理遇到的问题&解决办法 47 转置卷积转置卷积的基本概念转置卷积的基本操作填充和步幅在转置卷积中的作用多通道的转置卷积与矩阵变换的联…

2024年生成式人工智能(AIGC)进化速度太快了,如何帮助我们提升效率呢

在软件工程领域里,生成式人工智能(AIGC)正悄然重塑着程序员的日常作业模式。从源码的自动编写,到瑕疵的敏锐捕捉,再到测试流程的自主执行,AI驱动的工具已然晋升为编程人员不可或缺的智囊团。尽管如此&#…

Java String操作工具类:StrUtil

在日常的Java开发中,字符串(String)是最常用的数据类型之一。无论是数据处理、文本分析还是界面展示,都离不开对字符串的精细操作。然而,尽管Java标准库提供了丰富的字符串处理方法,但在实际项目中&#xf…

缓存-缓存使用2

1.缓存击穿、穿透、雪崩 1.缓存穿透 指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此纪录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询&a…

java信号量(Semaphore)

Java中的信号量(Semaphore)是一种用于控制多个线程对共享资源的访问的同步工具。它可以用来限制可以同时访问某些资源的线程数量。Semaphore 提供了一个计数器来管理许可证的获取和释放,每个许可证代表对资源的一次访问权限。 import java…

如何构建一个可伸缩的微服务架构?

如何构建一个可伸缩的微服务架构? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 微服务架构是一种将应用程序设计为一组小型服务的架构风格,每个服务运行在自己的进程中&am…

【Python进阶】函数的扩展

函数 目录 函数 一、容器知识补充 1、字典遍历方法 2、遍历字典元素 keys()方法: values()方法: items()方法: 3、公共运算符 4、公共方法 二、函数介绍 1、函数的概念 2、引入函数 3、函数定义与调用 4、函数的参数 5、函数…

机器学习与深度学习:区别(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习(ML:Machine Learning)与深度学习(DL:Deep Learning)是人工智能(AI)领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…

Unity扩展 Text支持超链接文本

重点提示:当前的文本扩展支持多个超链接,支持修改超链接规则和支持修改超链接颜色。 近期在邮件文本中用到了超链接。最初是在邮件窗口中新加一个按钮用来超链接跳转,之后发现效果表现不如直接在文本中添加,后经过几个小时的资料…

日本服务器托管需要注意哪些问题

日本服务器托管是一项涉及多方面因素的重要决策,为了确保托管服务的稳定、高效与安全,企业或个人在托管过程中需要注意以下几个关键问题: 首先,数据中心的基础设施建设标准是决定托管稳定性的关键。这包括数据中心的建筑抗震、抗洪…