MySQL--》理解锁机制中的并发控制与优化策略

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

1)全局锁:锁定数据库中的所有表

2)表级锁:每次操作锁住整张表

3)行级锁:每次操作锁住对应的行数据

目录

全局锁

表级锁

行级锁


全局锁

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

如下当我们进行数据备份的时候不加全局锁的情况下,就会导致在备份的时候还会发生数据的插入操作导致前后数据不一致:

我们在进行数据备份的时候,可通过如下步骤进行操作,在添加全局锁之后整个数据库只能读不能写,当数据库备份完毕之后我们再释放锁即可:

接下来我们演示如何添加全局锁并进行数据备份操作,如下所示:

添加全局锁:通过执行如下命令来进行添加全局锁操作:

flush tables with read lock;

如下代码当我们设置全局锁的时候,查询操作正常执行但数据更新就不能被执行了:

数据库备份:接下来我们开始进行数据库备份,mysqldump并不是sql命令而是一个工具,这里我们直接在cmd终端允许如下命令即可,-h是地址,-u是用户名,-p是密码,后面的是要备份的数据库名称,路径是要保存的地址:

mysqldump -h localhost -uroot -p123456 mysql_test > D:/mysql_test.sql

如下我们可以看到我们的数据库已经备份成功了,来到我们保存的地址通过文件打开可以看到我们的数据已经成功被备份出来了:

释放数据库:数据成功备份之后,我们要执行如下命令对数据库进行释放全局锁:

unlock tables;

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

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

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

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

mysqldump --single-transaction -h localhost -uroot -p123456 mysql_test > D:/mysql_test02.sql

表级锁

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

1)表锁:对于表锁主要分为两类:表共享读锁(read lock);表独占写锁(write lock),其语法如下所示:

-- 加锁 lock tables 表名... read/write -- 释放锁 unlock tables / 客户端锻炼连接

读锁:当我们进行读锁的时候,客户1对数据库执行了读锁操作,那其只能读不能写,客户2也是只能读不能写的,如下所示:

写锁:当我们进行写锁的时候,客户1对数据库进行了写锁操作,那其既能读又能写,但客户2却是不能进行读和写的操作,如下所示:

这里我们拿写锁进行演示,如下我们开了两个查询控制台当作两个客户在使用,客户1执行了写锁操作之后,客户2的读写都不能使用了,只有当客户1释放表锁之后,客户2才能正常使用,如下:

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

在MySQL5.5中引入MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候加MDL写锁(排他),如下表所示:

对于SQL

锁类型

说明

lock tables xxx read/write

SHARED_READ_ONLY / SHARED_NO_READ_WRITE

-

select、select…lock in share mode

SHARED_READ

与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥

insert、update、delete、select…for update

SHARED_WRITE

与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥

alter table…

EXCLUSIVE

与其他的MDL都互斥

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

当我们要对一张表加上表锁的时候,需要遍历整张表中是否加上了行锁,如果加上了行锁再加表锁就可能产生冲突了:

对于意向锁主要分为以下两种:

1)意向共享锁(IS):select … lock in share mode 添加,与表锁共享锁(read)兼容,与表锁排它锁(write)互斥:

2)意向排他锁(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;
行级锁

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

行锁(recordl lock):锁定单个行记录的锁防止其他事务对此行进行update和delete,在rc、rr隔离级别下都支持,如下所示:

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

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

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

当我们正常进行增删改查的时候,所加的行锁的类型如下所示:

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

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

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

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

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

2)索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
3)索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

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

临键锁(next-key lock):行锁和间隙锁组合,同时锁住数据并锁住数据前面的间隙gap,在rr隔离级别下支持,如下所示:

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

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

相关文章

LeetCode 2080 区间频率查询详解(哈希表 + 二分法)

深度解析:空间换时间的艺术 —— 从区间频率查询看哈希与二分 在处理大规模数据查询时,性能优化是核心。LeetCode 2080 题《区间内查询数字的频率》是一个绝佳的案例。本文将通过“哈希表预处理”与“二分查找”两大维度,带你领略现代 C 的解…

彻底搞懂浏览器原生录制:MediaRecorder API 深度解析

在现代 Web 开发中,音视频处理能力的边界正在不断扩展。过去依赖 Flash 或 Silverlight 插件才能实现的录制功能,如今已成为浏览器的原生能力。MediaRecorder API 正是这一变革的核心,它允许开发者直接在浏览器端捕获、编码并保存媒体流&…

AI大模型架构师必学指南:从知识储备到高薪前景,一篇收藏就够了!

AI大模型架构师是连接AI理论与产业落地的关键角色,需融合深度学习、分布式系统、软件工程等多领域知识。该岗位涵盖模型训练、部署与系统架构设计,要求兼具技术创新能力与行业洞察力。随着大模型在各行业广泛应用,人才需求激增,一…

IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛?

🌐 IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛?连上 WiFi ≠ 能通信,真正的网络刚刚开始在 IoT 开发中,你一定见过这些现象: ESP32 显示 WiFi 已连接,但服务器连不上MQTT / HTTP 超时,但 TCP/IP …

MySql-9.1.0安装详细教程(保姆级)

目录 MySQL介绍: 一、下载 Mysql 安装文件 二、Mysql 安装教程 1.下载完成后进入解压,注意不要放在一个非中文路径下的文件夹下面否则后面会报错。我在此处解压放在了D盘MySQL目录下。 2.解压后的文件应该没有.ini文件。因此,需要创建in…

AI产品经理转型与大模型学习路线图,附赠全套学习资源_月薪3W的AI产品经理学习路线

文章提供了AI产品经理和大模型工程师的完整学习路线。AI产品经理路线包括基础知识、专业技能和软技能三大阶段,涵盖AI技术、产品管理等核心能力。大模型学习路线包括系统设计、提示词工程、平台应用开发等七个阶段,并提供相关学习资源。文章强调理论与实…

大模型学习宝典:从小白到专家的进阶之路,建议收藏反复阅读

文章介绍了大模型的基本概念、分类和应用场景,详细解释了大模型的训练过程(预训练和微调),分析了当前"百模大战"的发展趋势及面临的挑战,包括失业、版权、偏见、犯罪和能耗等问题。大模型作为AI的重要发展方…

主流AI平台用户占55%,SHEEP-GEO凭五维模型成企业AI搜索战略伙伴

2026年,中国GEO(生成式引擎优化)市场迎来爆发式增长,行业预测显示市场规模将突破520亿元,同比增幅超190%。这一增长背后,是AI平台用户渗透率的快速提升——DeepSeek、豆包、元宝等主流平台用户占比已超55%&…

【ITK手册006】itk::Point 深度解析与实用指南

【ITK手册006】itk::Point 深度解析与实用指南 0. 概述 在 ITK (Insight Segmentation and Registration Toolkit) 的几何框架中,itk::Point 是最基础的类之一。它用于表示 n 维欧几里得空间中的一个静态位置(坐标)。 与 itk::Vector&#xf…

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT C…

量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码

量化交易的核心在于将交易规则和策略转化为计算机可执行的代码。其中,技术指标的计算和基于这些指标生成交易信号是策略实现的基础环节。本文将深入探讨如何从零开始开发量化交易脚本,重点聚焦于常见技术指标的计算逻辑以及如何基于这些指标设计并实现信…

MySQL 数据增删改查

一、插入数据 1.1 insert插入数据 (1)insert语法格式 INSERT [INTO] 表名 [字段名] VALUES (值列表);(2)示例 ① 向学生表中插入一行数据② 向学生表中插入多行数据二、更新数据 2.1 update更新数据 (1)…

RAG Agent记忆功能完全指南:3种方法解决长对话上下文丢失问题

本文介绍了为RAG Agent添加记忆功能的实现方法,重点讲解了如何通过消息列表实现短期记忆,以及解决长对话导致的上下文窗口限制问题,包括截断、删除和总结消息三种方法,并介绍了如何自定义AgentState来增强记忆能力,帮助…

Ehercat代码解析中文摘录<8>

12 工具从站协议栈代码工具允许根据用户特定要求和设置创建新的从站文件。从站文件列表:C源代码文件源代码文档(可选)设备描述(ESI)(可选)支持的操作系统:Windows XP, Vista, 7 (32位…

太流批了,老牌软件,数据对比神器

在日常工作中打工人有的时候需要整理表格和数据,需要在两个文档之间进行对比,看一看文件做了哪些修改。但是,如果用眼进行一行行对比的话就会很麻烦,而且效率会很慢。今天给大家推荐一款好用的数据对比软件,有需要的小…

收藏!裸辞转型AI大模型,我的完整攻略与经验分享

本文分享裸辞转型AI大模型的成功经历,包括转行动机、系统学习准备和面试经验。强调深入理解底层原理、做好经济心态准备、针对性优化简历和保持良好心态的重要性,为想进入AI领域的人提供实用参考。今年很重要的一个经历就是裸辞然后顺利转行到了AI大模型…

个性化旅游行程规划系统-计算机毕业设计源码+LW文档

摘要 随着人们生活水平的提高和旅游需求的日益增长,旅游已成为人们放松身心、拓展视野的重要方式。然而,在旅游过程中,行程规划、费用管理、信息分享等方面的问题也逐渐凸显。传统的旅游管理方式存在效率低下、信息不及时等问题,难…

北大团队创新方案:CKDA框架解决跨模态行人重识别的持续学习痛点

北大团队提出CKDA框架,解决跨模态行人重识别中的持续学习灾难性遗忘问题。该框架通过跨模态通用提示生成器提取共享特征,单模态专用提示生成器保留模态特有信息,以及跨模态知识对齐引擎防止遗忘。实验表明,该框架在四个主流数据集…

2026年--Lc333-328. 奇偶链表(链表)--java版

1.题目2.思路 原地重排链表: odd.nexteven.next:跳过偶数,把下一个奇数连起来 even.nextodd.next:跳过奇数,把下一个偶数连起来 最后把奇数链尾接回 evenHead 3.代码实现 /*** Definition for singly-linked list.* pu…

AI会取代前端吗?2026年前端发展路线图,建议收藏学习

AI无法完全取代前端开发,因缺乏人类的逻辑、沟通和创新能力。前端工作不仅是写代码,还包括与多团队协作。当前前端行业竞争激烈,要求不断提高,但仍有发展空间。前端工程师可考虑向管理、架构师或讲师方向发展,或继续深…