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

👨‍🎓作者简介:一位大四、研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.mfbz.cn/a/423418.html

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

相关文章

Linux学习笔记:进程的终止和等待

进程终止和等待 进程终止进程退出场景进程常见退出方式_exit()退出exit()退出return退出exit()与_exit()的不同之处 进程的等待什么是进程等待?为什么要进行进程等待如何进行等待wait方式:waitpid方式 进程终止 进程退出场景 一般来讲,进程的退出场景有三种: 代码运行完毕,…

Unity RectTransform·屏幕坐标转换

RectTransform转屏幕坐标 分两种情况 Canvas渲染模式为Overlay时,使用此方式 public Rect GetScreenCoordinatesOfCorners(RectTransform rt) {var worldCorners new Vector3[4];rt.GetWorldCorners(worldCorners);var result new Rect(worldCorners[0].x,world…

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

我的秋招数据分析岗面经分享(京东,美团,阿里,拼多多,vivo,滴滴)

节前,我们社群组织了一场技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对新手如何入门数据分析、机器学习算法、该如何备战面试、面试常考点分享等热门话题进行了深入的讨论。 基于社群的讨论,今天…

艺术家林曦:新的一年|开启人生的最佳竞技状态吧!

开年大吉呀~新的一年,你准备好如何启程了吗?    暄桐是一间传统美学教育教室,创办于2011年,艺术家林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,皆在以书法为起点,亲…

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…

测试需求平台8-Arco组件实现产品增改需求

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版,拥抱Vue3.0将前端框架替换成字节最新开源的arco.design,其中约60%重构和20%新增内容,定位为从 0-1手把手实现简单的测试平台开发教程,内容将囊括基础、扩展和实战&a…

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册:8 网络编程与自动化基础 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

大数据权限认证 Kerberos 部署

文章目录 1、什么是 Kerberos2、Kerberos 术语和原理2.1、Kerberos 术语2.1、Kerberos 原理 3、Kerberos 服务部署3.1、前置条件3.2、安装依赖3.3、配置 krb5.conf3.4、配置 kdc.conf3.5、配置 kadm5.acl3.6、安装 KDC 数据库3.7、启动服务3.8、创建 Kerberos 管理员3.9、创建普…

qsort的使用与实现

c语言常见的排序方法大概有这些,今天我们所讲的是就是qsort快排的讲解 头文件 qsort的使用 我们先使用msdn查看他的相关资料,得知这个函数的传参请情况 1.void *base 翻译过来就是将要排序的函数的起始位置/数组首元素地址 2.size_t num 翻译过来就是数…

vue项目获取拼音首字母

工具包 pinyin-pro npm install pinyin-pro 官方地址 pinyin-pro | pinyin-pro性能优异、转换准确的 js 中文转拼音工具https://pinyin-pro.cn/示例代码(获取每个汉字的拼音首字母) import {pinyin} from pinyin-pro;function getPinyinInitial(name){if (name) {let py p…

redis实战笔记汇总

文章目录 1 NoSQL入门概述1.1 能干嘛?1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么?2.2 能干嘛?2.3 怎么玩?核心…

高性能MySQL 第4版

第一章MySQL架构 MySQL提供了多种锁的颗粒度,每种MySQL存储引擎都可以实现自己的锁策略和锁力度。 行级锁是在存储引擎而不是在服务器中实现的。 隔离界别 READ UNCOMMITTED - 脏读 在事务中可以可以查看到其他事务中还没有提交的修改。实际中很少用。 READ C…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量;非基变量、非基向量;基解、基可行解;四、最优解与可行解、基可行解的关系五、用例题(枚举法)巩固基解、基可行解、最优解三个概念1、例…

鸿蒙Harmony应用开发—ArkTS声明式开发(点击事件)

组件被点击时触发的事件。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 onClick onClick(event: (event: ClickEvent) > void) 点击动作触发该回调。 卡片能力: 从API version 9开始…

【python】`assert`断言语句

assert是一个断言语句,用于在代码中检查某个条件是否为真。 如果条件为假,将触发AssertionError 异常,从而指示存在错误。

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据,去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章,这次是根据…

C++ //练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。

C Primer(第5版) 练习 10.19 练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。 环境:Linux Ubuntu(云服务器) 工具:vim …

【buuctf-gakki】

binwalk 查看图片,发现有 rar 文件,提取后如上图所示(flag.txt为已经解压后出来的)其中这个 rar 需要用 archpr爆破一下 打开后一个 flag.txt 一堆杂乱无章的字符,需要用到 python 脚本进行词频统计,我们…

专家教你学汽车美容护理,汽车美容师职业技能教学

一、教程描述 本套汽车美容教程,大小2.52G,61个文件。 二、教程目录 01-大家跟我学汽车美容(共30课时) 02-汽车内外饰物的安装(共15课时) 03-汽车必需设施的安装(共13课时) 04…