MySQL数据库进阶第五篇(锁)

news2024/9/29 9:32:16

文章目录

  • 一、锁的概述
  • 二、全局锁
  • 三、表级锁
  • 四、元数据锁(meta data lock, MDL)
  • 五、意向锁
  • 六、行级锁
  • 七、行锁(Record Lock)
  • 八、间隙锁(Gap Lock)
  • 九、临键锁(Next-Key Lock)
  • 十、锁总结

本篇博客深入详细地讨论了数据库锁的种类和使用场景。首先介绍了全局锁的含义和使用场景,如全库逻辑备份,但这将阻塞后续的写和更新操作。然后博客讨论了表级锁和元数据锁(MDL),它们在操作表和表结构时自动添加,以保持数据一致性。同时,博文也讲解了“意向锁”和行级锁的概念,解释了它们如何减少冲突和提高并发性能。最后,作者阐述了更加细粒度的“间隙锁”和“临键锁”,如何通过防止’幻读’来维护数据的一致性。本文涵盖了从更宏观的全局锁,到更微观的行级锁,甚至于间隙锁和临键锁的各种锁机制,为读者对数据库锁有了更全面深入的了解。

一、锁的概述

在这里插入图片描述
在这里插入图片描述

二、全局锁

在这里插入图片描述
对整个数据库实例加锁,加锁后整个实例处于只读状态,后续DML的写语句,DDL语句,更新操作的事务提交都将被阻塞

使用场景:全库逻辑备份(将数据库中的数据备份成一个SQL文件保存在磁盘中

若执行备份过程中,还有数据的修改和插入,则备份的数据无法保证数据的一致性和完整性。

例如表订单,表库存,表订单日志,逐个备份该表的过程(备份顺序:订单->库存->日志)中依然有下单的操作,即备份了订单 但库存已经减少等操作 会导致数据库的数据不一致

flush tables with read lock ; # 加全局锁
sudo mysqldump -h 127.0.0.1 -uroot -p123456 -d db01 > db01.sql # 数据备份 shell界面中执行
unlock tables; # 再登录到MySQL,释放锁

加锁后,DML和DDL无法操作,DQL查询数据 依然可以使用

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

如果在主库上备份,那么在备份期间都不能执行更新
如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟

在InnoDB引擎中,可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份
sudo mysqldump -single-transaction -h 127.0.0.1 -uroot -p123456 -d db01 > db01.sql

三、表级锁

在这里插入图片描述
表锁

表共享读锁(read lock)
表独占写锁(write lock)

lock tables 表名... read/write  # 加锁
unlock tables / 客户端断开连接  # 释放锁

四、元数据锁(meta data lock, MDL)

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上

主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与 DDL冲突(增删改 DDL:数据库 表 表字段 ,DML:表中数据),保证读写的正确性。

元数据就是表结构,元数据锁就是维护表结构一致性的锁

当对一张表进行增删改查的时候 DML语句,加MDL读锁(共享)
当对表结构进行变 更操作的时候 DDL语句,加MDL写锁(排他)
在这里插入图片描述

查看元数据锁的加锁情况:

select object_type, object_schema, object_name,lock_type, lock_duration from performance_schema.metadata_locks ;

五、意向锁

若两个线程操作一张表,线程A对表加了行锁/表锁,之后 线程B要对表加表锁,线程B需要先遍历表 查看表是否已经被加行锁 或者 表锁。

为了减少类似以上,DML执行时加的行锁与后来要加的表锁冲突的现象。InnoDB引入了意向锁,使表锁不用再检查每行是否被加锁,使用意向锁减少了表锁的检查。
在这里插入图片描述
在这里插入图片描述
意向共享锁(IS):由语句select … lock in share mode添加

​ 与表锁共享锁 (read)兼容,与表锁排他锁(write)互斥

意向排他锁(IX)由insert、update、delete、select…for update添加 。

​ 与表锁共 享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥

通过SQL查看意向锁和行锁的加锁情况:select object_schema, object_name, index_name, lock_type, lock_mode, lock_data from performance_schema.data_locks;

六、行级锁

在这里插入图片描述

七、行锁(Record Lock)

行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在 RC、RR隔离级别下都支持
在这里插入图片描述

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

排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁

排他锁:所有客户端都不能进行对表的任何操作
在这里插入图片描述
在这里插入图片描述

注意:

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

八、间隙锁(Gap Lock)

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

举例:
在这里插入图片描述

# -----------------------------------------客户端1-----------------------------------------
begin;
update usr set age = 40 where id = 5; 
# 在客户端1 update了一个不存在的id=5后,加上了间隙锁 (3,8)
commit;
# -----------------------------------------客户端2-----------------------------------------
begin;
INSERT INTO usr VALUES (7,'安拉', '17799998819', 'jd1h@126.com', '城市规划', 51,'2', '0', '2001-09-15 00:00:00');  # 阻塞,被间隙锁,直到客户端1 commit
commit;

九、临键锁(Next-Key Lock)

行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。 在RR隔离级别下支持。
在这里插入图片描述

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜 索和索引扫描,以防止幻读。

举例:

非唯一索引,为了其它事务向间隙中插入一条记录 出现幻读现象,因此会把(3,7)的间隙锁上,把3之前的这块间隙也锁住,3这行数据也锁住
在这里插入图片描述

注意:

索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。

索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止

举例:锁19这行的数据,邻键锁锁上(1925)以及25这行记录,还有邻键锁锁上正无穷大 以及 (25,+) 的间隙

在这里插入图片描述
间隙锁锁间隙,不包含对应的数据记录,只锁定该数据记录之前的这部分间隙

邻键锁即包含当前的数据记录,也会锁定该数据记录之前的这部分间隙

间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会 阻止另一个事务在同一间隙上采用间隙锁

十、锁总结

全局锁:锁定数据库中的所有表(数据库备份

表级锁:每次操作锁住整张表
读锁/写锁 lock tables 表名… read/write; unlock tables;
元数据锁 自动加 DML语句 数据的增删改查时 MDL读锁,DDL语句表结构变更 MDL写锁
MDL读锁:
shared_read:select, select … lock in share mode,
shared_write:insert ,update, select … for update
MDL写锁:alter table
意向共享锁/意向排它锁 自动加
加意向共享锁:shared_read:select, select … lock in share mode,
加意向排它锁:shared_write:insert ,update, select … for update

行级锁:每次操作锁住对应的行数据。只针对索引,如果不是索引 升级成表锁
行锁:共享锁/排它锁
排它:insert,update,delete, select … for update
共享:select … lock in shared mode
select 不加任何锁
间隙锁和邻键锁:间隙锁锁住间隙,邻键锁锁数据和间隙。

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

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

相关文章

python(ch1)

四个软件简介 1. IDLE IDLE 是 Python 官方 IDLE 开发环境,一个功能简单的文本编辑器,带有语法高亮、自动补全和缩进功能。它适合初学者学习 Python 的基本语法和概念。 2. PyCharm PyCharm 是 JetBrains 开发的一款功能强大的 Python IDE&#xff0…

ChatGPT带火的HBM是什么?

“ChatGPT是人工智能领域的iPhone时刻,也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火,对大算力芯片提出了更高更多的要求。近日,据韩国经济日报报道,受惠于ChatGPT&am…

naive-ui-admin BasicTable 列表操作栏显示图标icon

效果图 在使用BasicTable的页面添加引用,这里随便弄了个icon import { GameController } from "vicons/ionicons5" 自定义列 const actionColumn reactive({width: 180,title: "操作",key: "action",fixed: "right",ren…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代,电子邮件和联系人信息成为了许多企业和个人重要的资源,在本文中,我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息,并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

【笔记】深度学习入门:基于Python的理论与实现(二)

神经网络的学习(神经网络的学习阶段,不是我们学习神经网络) 从数据中学习 训练数据和测试数据 机器学习中,一般将数据分为训练数据和测试数据两部分来进行学习和 实验等。首先,使用训练数据进行学习,寻找最…

SQL进阶(三):Join 小技巧:提升数据的处理速度

复杂数据结构处理:Join 小技巧:提升数据的处理速度 本文是在原本sql闯关的基础上总结得来,加入了自己的理解以及疑问解答(by GPT4) 原活动链接 用到的数据:链接 提取码:l03e 目录 1. 课前小问…

C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径

C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径 参考博文: 1.C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径 2.Linux笔记之LD_LIBRARY_PATH详解 3.qt-C++笔记之使用QProcess去执行一个可执行文件时指定动态库所存放的文件夹lib的路径 c…

React PureComponent 和 React.memo()区别

1 注意 ● PureComponent和memo仅作为性能优化的方式存在 ● 不要依赖它来阻止渲染,会产生BUG ● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。 2 PureComponent 和React.memo() 区别 PureComponent 和React.memo()都是React优化…

Sora专辑|AI界一夜变天

没有丝毫预热和剧透,Open AI深夜直接丢下核弹炸了街,从业者深感要变天。 2月16日凌晨,Open AI发布了首个“文生视频”模型Sora。官方介绍,Sora能根据文字指令创造出包含丰富细节的逼真场景、角色,且能用多角度镜头,生成一镜到底的60秒长视频。 目前官网上已经更新了48个…

python Matplotlib Tkinter-->导出pdf报表

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 reportlab 4.0.9 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox impor…

【java-集合框架】ArrayList类

📢java基础语法,集合框架是什么?顺序表的底层模拟实现都是看本篇前的基础必会内容,本篇不再赘述,详情见评论区文章。 📢编程环境:idea 【java-集合框架】ArrayList类 1. 先回忆一下java代码中常…

Facebook Messenger链接分享:如何创建链接并设置自动化内容

Facebook Messenger链接是指基于Facebook用户名创建的会话链接,用户可以在其Facebook页面的设置部分复制此链接进行分享。然后将该链接直接粘贴到独立站、电子邮件、名片或社交媒体中,让目标受众可以一键进入对话。为了满足某些商家的需求,Fa…

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

时间序列分析实战(四):Holt-Winters建模及预测

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

C++ //练习 9.24 编写程序,分别使用at、下标运算符、front和begin提取一个vector中的第一个元素。在一个空vector上测是你的程序。

C Primer&#xff08;第5版&#xff09; 练习 9.24 练习 9.24 编写程序&#xff0c;分别使用at、下标运算符、front和begin提取一个vector中的第一个元素。在一个空vector上测是你的程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;v…

详解POCV/SOCV的时序报告

​POCV/SOCV的时序报告中有如下变量&#xff1a; Mean: 高斯分布中的μ值&#xff08;平均值&#xff09; Sensit: sensitivity&#xff0c;也就是1个Sigma的值&#xff1b; Corner: Sigma边界的最差值 cell的delay Delay mean N * Delay sigma; cell 的Transition Sl…

UE5 C++ Widget练习 Button 和 ProgressBar创建血条

一. 1.C创建一个继承Widget类的子类&#xff0c; 命名为MyUserWidget 2.加上Button 和 UserWidget的头文件 #include "CoreMinimal.h" #include "Components/Button.h" #include "Blueprint/UserWidget.h" #include "MyUserWidget.genera…

OpenCV 16 - Qt使用opencv视觉库

1 下载好opencv视觉库 不知道怎么下载和编译opencv视觉库的可以直接使用这个 : opencvcv_3.4.2_qt 2 解压opencv包 3 打开opencv的安装目录 4.打开x86/bin 复制里面所有的dll文件&#xff0c;黏贴到C/windows/syswow64里面 5 新建Qt项目 6 修改pro文件:添加对应的头文件和库文件…

【HMAC-SHA1算法以及工作原理】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱总结 简述概要 连接HMAC-SHA1工作原理以及工具代码 知识图谱 HMAC&#xff08;Hash-based Message Authentication Code&#xff0c;基于散列的消息认证码&#xff09;是一种结合了密钥和消息的认证方法…

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…