MySQL进阶:全局锁、表级锁、行级锁总结

news2024/11/25 11:35:45

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:MySQL进阶:MySQL事务、并发事务问题及隔离级别
📚订阅专栏:MySQL进阶
希望文章对你们有所帮助

全局锁、表级锁、行级锁总结

  • 概述
  • 全局锁
    • 介绍
    • 语法
    • 特点
  • 表级锁
    • 介绍
    • 表锁
      • 表共享读锁(read lock)
      • 表独占写锁(write lock)
    • 元数据锁
    • 意向锁
  • 行级锁
    • 介绍
    • 行锁
    • 间隙锁/临键锁

概述

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
MySQL中的锁,按照锁的粒度分,分为以下三类:

  • 全局锁:锁定数据库中的所有表
  • 表级锁:每次操作锁住整张表
  • 行级锁:每次操作锁住对应的行数据

全局锁

介绍

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,以及更新操作的事务提交语句都将被阻塞。
典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

分析一下若不加全局锁,会发生的问题:
假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。
在这里插入图片描述
若发生了上图所示的流程:

1、在进行数据备份时,先备份了tb_stock库存表(给tb_stock加锁,备份完解锁)
2、在业务系统中,执行了下单操作,扣减库存,生成订单(更新tb_stock表,插入tb_order表)
3、再备份tb_order表的逻辑(给tb_order加锁)
4、执行插入订单日志操作
5、最后再备份tb_orderlog表(给tb_orderlog加锁)

这时候会出现数据不一致的情况,tb_stock被锁住了,执行下单业务后没办法修改tb_stock,但却修改了tb_order,同理,tb_order和tb_orderlog也会出现类似情况。

此时就需要借助MySQL的全局锁来解决:
在这里插入图片描述

对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的DDL、DML全部都处于阻塞状态,但是可以执行DQL语句,也就是处于只读状态,而数据备份就是查询操作。
只要数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就保证了数据的一致性和完整性。

语法

1、加全局锁

flush tables with read lock;

2、数据备份

-- mysqldump指令加的是全局锁,-u后指定用户名,-p后指定密码,wxj表示数据库名称,wxj.sql表示保存出来的文件名
mysqldump -uroot –p123456 wxj>/路径名.wxj.sql

需要注意mysqldump不是MySQL指令,需要在非MySQL命令行中执行

3、释放锁

unlock tables ;

特点

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

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份:

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

表级锁

介绍

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

  • 表锁
  • 元数据锁
  • 意向锁

表锁

语法:

  • 加锁:lock tables 表名… read/write。
  • 释放锁:unlock tables / 客户端断开连接 。

表共享读锁(read lock)

当某一个客户端对指定表加了读锁,那么所有的客户端都无法再对表进行写操作(包括自己),但是所有的客户端都可以进行读操作(读共享)。
在这里插入图片描述

表独占写锁(write lock)

当某一客户端对指定表加了写锁,那么就会产生独占的效果,即只有自己可以对该表进行读和写的操作,但不允许其他客户端对该表进行任何读或写的操作。
在这里插入图片描述

元数据锁

meta data lock , 元数据锁,简写MDL。
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
为了避免DML与DDL冲突,保证读写的正确性。

注意,这里的元数据可以直接理解成一个表的表结构,也就是说,某一张表涉及到未提交的事务时,不能修改这张表的表结构。

当对一张表进行增删改查(DML)时,加MDL读锁(共享);当对表结构进行变更(DDL),加MDL写锁(排他)。
常见的SQL操作,所添加的元数据锁:

SQL锁类型说明
select、select … lock in share modeSHARED_READ与SHARED_READ、SHARED_WRITE兼容,但与EXCLUSIVE互斥
insert、update、delete、select … for updateSHARED_WRITE与SHARED_READ、SHARED_WRITE兼容,但与EXCLUSIVE互斥
alter table …EXCLUSIVE与其他的MDL都互斥

总之,当某一客户端对表进行增删改查操作时,其他客户端也可以进行增删改查的操作,但是其他客户端无法对表结构进行修改,反过来亦是如此。

我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:

意向锁

我们可以先分析没有意向锁的时候会发生的情况。

可以先看之前写过的文章,有关于SQL优化中的update优化,提到了优化策略是防止行锁升级成表锁,也就是通过主键索引来做update:
MySQL进阶:大厂高频面试——各类SQL语句性能调优经验

也就是说,当我们根据主键索引进行update时,会对这一条数据增加行锁。此时若有其他的客户端要对该表加表锁,它需要扫描整张表,查看这张表是否包含行锁,若包含,则无法加这个表锁,容易发现,这种全表扫描的效率过于低下了。
在这里插入图片描述
在这里插入图片描述

1、介绍
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
假设加了意向锁,上面的加锁流程可以大大简化:
(1)客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
在这里插入图片描述
(2)其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。
在这里插入图片描述
2、分类

  • 意向共享锁(IS):由select … lock in share mode添加,与表锁共享锁(read)兼容,与表锁排他锁(write)互斥
  • 意向排他锁(IX):由insert、update、delete、select…for update添加,与表锁共享锁(read)和表锁排他锁(write)都互斥,但意向锁之间是不会互斥的。

总结:读读兼容,读写互斥,写写互斥

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

行级锁

介绍

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

  • 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
    在这里插入图片描述
  • 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事
    务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
    在这里插入图片描述
  • 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
    在这里插入图片描述

行锁

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

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

两种行锁兼容情况:共享锁和共享锁之间兼容,其它情况都冲突。
常见的SQL语句在执行时所加的行锁:

SQL行锁类型说明
INSERT排他锁自动加锁
UPDATE排他锁自动加锁
DELETE排他锁自动加锁
SELECT(正常)不加任何锁
SELECT … LOCK IN SHARE MODE共享锁需要手动在SELECT之后加LOCK IN SHARE MODE
SELECT … FOR UPDATE排他锁需要在SELECT之后加FOR UPDATE
  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

可以通过下列SQL语句查看意向锁以及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from 
performance_schema.data_locks;

间隙锁/临键锁

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读(MySQL事务、并发事务问题及隔离级别)

有三种非常重要的情况:

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁
  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁
  • 索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止

解析:

1、索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁
在这里插入图片描述

右边事务一定不可以insert,否则左边事务的update操作就能操作成功了,然而在这个间隙内的id根本都不存在,这就是幻读。

2、索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
在这里插入图片描述

我们知道InnoDB的B+树索引,叶子节点是有序的双向链表。 假如,我们要根据这个二级索引查询值为18的数据,并加上共享锁,我们是只锁定18这一行就可以了吗? 并不是,因为这是非唯一索引,这个结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(案例中为29)。此时会对18加临键锁,并对29之前的间隙加锁。

在这里插入图片描述
3、索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止
在这里插入图片描述
查询的条件为id>=19,并添加共享锁。 此时我们可以根据数据库表中现有的数据,将数据分为三个部分:[19]、(19,25]、(25,+∞]

所以数据库数据在加锁是,就是将19加了行锁,25的临键锁(包含25及25之前的间隙),正无穷的临键锁(正无穷及之前的间隙)。

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

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

相关文章

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置,首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏,如MMORPG或MOBA等,由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…

【Spring Boot 3】的安全防线:整合 【Spring Security 6】

简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与Sp…

Python中几个必须知道的函数

Python中自带了几个比较有意思的函数,一般在面试或者笔试基础的时候会问到,其中3个就是map、filter、reduce函数。 1.map(function, iterable) 它第一个要传的元素是函数名或lambda匿名函数表达式,第二个元素传入可迭代对象。 array [1,2,…

【饮食】日常零食 保健食品分类(附食品营养成分表与执行标准,Coursera营养学课程笔记)

程序员生活指南之 【饮食】日常零食 & 保健食品分类和推荐(附食品营养成分表与执行标准) 文章目录 一、保健食品1、什么是保健食品?2、常见保健食品分类3、常见保健食品推荐 二、日常零食(食品营养成分表与执行标准&#xff0…

详解JavaScript的函数

详解 JavaScript 的函数 函数的语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) { 函数体 return 返回值; // return 语句可省略 } 函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 示例代码 //定义的没有参数列表&am…

【C语言】sizeof和strlen的比较

1. sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候,我们学习了 sizeof , sizeof 是一个单目操作符, 绝对不是函数!!!sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节。 如果操作数…

three.js 点乘判断平行向量方向异同

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div>判断的前提是两个向量平行<el-button click"judge"…

2025张宇考研数学,百度网盘视频课+36讲PDF讲义+真题

张宇老师的课属于幽默生动&#xff0c;会让一个文科生爱上数学&#xff0c;但是有的同学不知道在哪看&#xff0c;可以看一下&#xff1a;2025张宇考研数学全程网盘 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 可以粘贴在浏览器 张宇30讲作为一本基础讲义&#xff1a;和教材…

6、wuzhicms代码审计

wuzhicms代码审计 前言 安装环境配置 服务器要求 Web服务器: apache/nginx/iis PHP环境要求:支持php5.2、php5.3、php5.4、php5.5、php5.6、php7.1 (推荐使用5.4或更高版本!) 数据库要求: Mysql5www/install文件夹即可进入安装页面 审计开始 首页文件index.php&#xff0c…

latex使用Bibtex添加参考文献指南(TeXstudio)

目录 参考链接 Bibtex 使用方法 编译方法 参考链接 https://www.cnblogs.com/whyaza/p/11803493.html &#xff08;Latex&#xff09;Latex TeXstudio Bibtex 使用指南 - 简书 Latex-bibtex使用方法-CSDN博客 Latex插入参考文献的两种方法—自动与手动_latex 参考文献-…

免费下载全网视频系列:一键下载央视视频

之前分享过全网视频下载工具下载视频不求人&#xff0c;免费下载全网视频&#xff0c;今天再分享几个下载央视视频的工具。 第一个是央视频4k下载器&#xff0c;比如下载这个视频https://www.yangshipin.cn/#/video/home?vidv0000313oqb&#xff0c;打开工具在命令行输入 v00…

Ubuntu将c++编译成.so文件并测试

一、准备cpp和h文件 创建test.cpp 在cpp中定义相加的函数funcAdd&#xff0c;给出函数的细节代码 #include <iostream> using namespace std;int funcAdd(int x, int y) {return xy; }创建test.h 在h中声明定义的函数&#xff0c;不需要任何细节 #ifndef __TEST__ #…

实验:依赖注入之构造器注入

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

文章总结(拉钩教育)

方法论 那对于我们专栏来说&#xff0c;在面对复杂的检索知识的时候&#xff0c;我更建议你通过理解记忆的方式进行学习。具体的方式有啥呢&#xff1f;我比较推荐问答的方式。也就是说&#xff0c;在学习每个知识点的时候&#xff0c;你可以一直问自己几个问题&#xff0c;比…

地信专业未来的前景如何,该怎么学习?

广大普通学校GIS专业学生&#xff0c;如果继续在GIS方向发展&#xff0c;而且走开发路线&#xff0c;结合我这几年面试以及带应届毕业生的经验&#xff0c;学习路线我有这几个方面的建议&#xff0c;仅供参考&#xff1a; 1.大一的时候要学好高数、线性代数和概率论&#xff0c…

STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407

文章目录 目的基础说明主要配置关键代码示例演示示例链接关于中断总结 目的 以太网是比较常用到的功能&#xff0c;这篇文章讲演示在STM32F407上启用以太网功能&#xff0c;使之能够加入网络中&#xff0c;通过DHCP获得IP地址&#xff0c;可以被Ping通。 基础说明 STM32F407…

EI顶刊复现:基于氨储能技术的电转氨耦合风–光–火综合能源系统双层优化调度程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序首先提出电转氨耦合综合能源系统构型&#xff0c;并为燃煤机组出力、风光消纳和电转氨运行的经济性和稳定性的综合评价定义风–光–火–氨系统协调运行指标&#xff1b;进而构建以协调运行指标最大为上层目标、电转氨耦合风–光–火…

数据结构与算法:堆

朋友们大家好啊&#xff0c;本篇文章来到堆的内容&#xff0c;堆是一种完全二叉树&#xff0c;再介绍堆之前&#xff0c;我们首先对树进行讲解 树与堆 1.树的介绍1.1节点的分类 2.树的存储结构3.二叉树的概念和结构3.1 二叉树的特点3.2 特殊的二叉树3.3二叉树的存储结构 4.堆的…

(科目三)计算机基础及网络的应用

1.计算基础知识 计算机是20世纪人类最伟大的发明之一&#xff0c;它是由电子逻辑部件组成的一种能够存储信息、自动完成各种运算的逻辑设备。 世界上第一台数字电子计算机ENIAC于1946年诞生在美国的宾夕法尼亚大学&#xff0c;由约翰莫克里和普雷斯波艾克领导研制。 当前&am…

【SpringBoot】mybaitsPlus的多数据源配置

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 mybatisPlus的多数据源配置 适用于多种场景&#xff1a;纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多…