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

文章目录

  • 一、锁的概述
  • 二、全局锁
  • 三、表级锁
  • 四、元数据锁(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 不加任何锁
间隙锁和邻键锁:间隙锁锁住间隙,邻键锁锁数据和间隙。

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

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

相关文章

遇见数字孪生城市美好模样 国产GIS加速创新竞逐“新赛道”

在未来数字孪生城市中,每一座建筑、每一条道路、每一盏路灯、每一辆车,甚至每一个人,都有其对应的数字孪生体。这些数字孪生体在虚拟世界中形成了城市的细致模型,如同镜子一样,反映出城市的实时状态,同时也…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

HTB pwn Dragon Army

逆向分析 程序使用了alloca函数扩大了栈区 此处可以泄露libc的地址 程序主要功能在下面 while ( 1 ){while ( 1 ){fflush(stdin);fflush(_bss_start);fprintf(_bss_start, "\n%sDragons: [%d/%d]%s\n\n", "\x1B[1;34m", v5, 13LL, "\x1B[1;37m"…

山海鲸可视化:数据分析师的明智之选

作为一名资深的数据分析师,我深知数据可视化在数据分析和决策制定中的重要性。在众多的数据可视化工具中,我最终选择了山海鲸可视化软件。本文就简单介绍几点我选择它的主要原因: 首先,山海鲸可视化软件提供了强大的数据整合能力…

MySQL-事务,properties文件解析,连接池

1.事务机制管理 1.1 Transaction事务机制管理 默认情况下是执行一条sql语句就保存一次,那么比如我们需要三条数据同时成功或同时失败就需要开启事务机制了。开启事务机制后执行过程中发生问题就会回滚到操作之前,相当于没有执行操作。 1.2 事务的特征 事…

sql-labs25-28a

一、环境 网上都有不过多阐述 二、sql-labs第25关 它说你的OR和and属于它,那就是过滤了OR和and 注入尝试 不用or和and进行爆破注入,很明显是有注入点的 ?id-1 union select 1,2,3-- 查看数据库 ok,此道题算是解了但是如果我们用了and了呢 ?id-1 and updatex…

消息中间件篇之Kafka-高性能设计

一、高性能设计 消息分区:不受单台服务器的限制,可以不受限的处理更多的数据。 顺序读写:磁盘顺序读写,提升读写效率。 页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。 零拷贝&a…

C# 水排序 微信小游戏

来只 水排序谜题启发式搜索方法_水排序解法小程序-CSDN博客 大神的C语言转换成C# 语言,更多的请看原作者,这里直接贴C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApp2 {class Pro…

SImpAl

output matrix M,Curriculum using w ( x t , f , h ) w(x_t, f, h) w(xt​,f,h) 辅助信息 作者未提供代码

想露一手Linux命令,掌握这20个够用了!

中午好,我的网工朋友。 想做好网工,除了路由交换,掌握Linux操作系统也是很重要的。 因为很多服务器上都是用的Linux系统,要和服务器机器交互,就要通过Linux的相关命令。 正在找工作的朋友,如果面试时&am…

thinkphp6定时任务

这里主要是教没有用过定时任务没有头绪的朋友, 定时任务可以处理一些定时备份数据库等一系列操作, 具体根据自己的业务逻辑进行更改 直接上代码 首先, 是先在 tp 中的 command 方法中声明, 如果没有就自己新建一个, 代码如下 然后就是写你的业务逻辑 执行定时任务 方法写好了…

leetcode 2867. 统计树中的合法路径数目【筛质数+贡献法】

原题链接:2867. 统计树中的合法路径数目 题目描述: 给你一棵 n 个节点的无向树,节点编号为 1 到 n 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ui, vi] 表示节点 ui 和 vi 在树中有一条边。 …

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说,我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

请求包的大小会影响Redis每秒处理请求数量

文章目录 🔊博主介绍🥤本文内容压测规划客户端长连接数量对性能的影响请求包大小的影响Pipleline模式对Redis的影响 📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领…

CG-0A 电子水尺可实现对水位数据的连续自动监测

CG-0A 电子水尺可实现对水位数据的连续自动监测产品概述 本产品是一种采用微处理器芯片为控制器,内置通讯电路的数字式水位传感器,具备高的可靠性及抗干扰性能。适用于江、河、湖、水库及蓄水池、水渠等处的水位测量使用。 本产品采用了生产工艺技术&…

springboot集成kafka快速入门demo

一、kafka介绍 Kafka是一种基于分布式发布-订阅消息系统的开源软件。 其目标是提供高吞吐量、低延迟、可扩展性和容错能力。 Kafka中将消息存储在可配置数量的分区中,以便实现横向扩展,并且支持多个生产者和消费者,具有良好的可靠性保证机制。…

【精选】Java面向对象进阶——静态内部类和局部内部类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

SpringCloud有哪些组件

什么是SpringCloud? Spring Cloud是基于Spring Boot的分布式系统开发工具,它提供了一系列开箱即用的、针对分布式系统开发的特性和组件,用于帮助开发人员快速构建和管理云原生应用程序。 Spring Cloud的主要目标是解决分布式系统中的常见问题…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件,适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具,包括音频录制、编辑、混音以及MIDI制作等功能,帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

Linux之定时任务①(实施必会!!!)

文章目录 常见脚本一、 什么是crond二、crond的使用场景一、apache服务器监控三、crond服务四、命令格式五、cron格式六、定时任务备份七、数据库定时备份八、使用shell脚本发送邮件 常见脚本 [rootlocalhost ~]# vim apacheSentry.sh#!/bin/bash # author: tt # description:…