深入了解 MySQL 锁机制

news2025/4/4 18:11:38

MySQL作为一个常用的关系型数据库系统,其事务处理能力强大,并提供了丰富的锁机制以保障数据的一致性和并发操作的有效性。在多用户并发操作的环境中,锁是控制资源访问的重要工具。本文将详细介绍MySQL中锁的分类及其具体应用,包括乐观锁、悲观锁、全局锁、表锁、行锁等内容。

一、MySQL锁的分类

1. 按照持有方式分类:乐观锁与悲观锁

悲观锁:顾名思义,悲观锁是对数据资源的保护策略,假设在并发访问中会发生冲突,因此在访问数据之前,先对数据进行加锁,确保其他事务不能访问或修改数据。典型的悲观锁在MySQL中主要体现在行锁和表锁上。

乐观锁:与悲观锁不同,乐观锁假设并发冲突的概率较小,因此它不在一开始就加锁,而是进行读取操作并在提交更新时,检查数据是否被其他事务修改过。如果在提交时发现数据已被修改,则会回滚或进行重试。乐观锁的实现通常依赖于版本号或时间戳。

2. 按照操作类型分类:读锁与写锁

读锁(共享锁):读锁是指多个事务可以同时对同一数据进行读取,但在加读锁的同时,不能对数据进行写操作。在MySQL中,读锁通常指“共享锁”,即多个事务可以并发地读取同一数据,但不能进行更新操作。

写锁(排它锁):写锁是对数据的排他性控制,只有一个事务能够对数据进行修改,其他事务在该数据上会被阻塞,不能进行读或写操作。在MySQL中,写锁通常指“排它锁”,它能够保证数据在事务提交之前不被其他事务修改。

3. 按照数据操作粒度分类:全局锁、表锁、行锁、间隙锁

全局锁:全局锁是锁定整个数据库系统的所有表。它的锁粒度最大,能够防止任何其他事务的修改操作。常见的应用场景是备份操作。例如,在执行逻辑备份时,需要使用全局锁来确保备份过程中数据的一致性。

表锁:表锁是锁定整个表,通常在需要对整个表进行操作时使用。它的粒度相对较大,但操作较简单。表锁包括表的读锁(共享锁)和写锁(排它锁)。表锁应用于需要频繁更新整个表的场景,但它的性能较差,因为它会阻塞其他事务对表的访问。

行锁:行锁是锁定表中的某一行数据,是MySQL支持的最精细的锁机制。行锁可以让多个事务并发操作不同的行,减少了冲突的机会。行锁分为共享锁和排它锁,适用于需要高并发且更新操作较少的场景。

间隙锁:间隙锁是指锁住的是一段范围,而不是具体的记录。MySQL使用间隙锁来防止其他事务插入数据到某个区间,以避免幻读的发生。

二、MySQL全局锁及其应用

MySQL的全局锁通过锁定整个数据库实例来确保数据库备份的一致性。常见的操作是执行“FLUSH TABLES WITH READ LOCK”,它能够锁住所有表,防止其他事务修改数据。

应用场景:

  • 逻辑备份:在进行逻辑备份时,通过全局读锁锁定数据库,确保在备份过程中没有其他事务修改数据。这能保证备份的一致性,避免由于并发更新操作导致备份数据和实际数据不一致。

使用方式:

  1. 加全局读锁FLUSH TABLES WITH READ LOCK;

    • 该操作会使当前会话窗口锁住所有库的所有表,其他事务可以读取表中的数据,但不能进行写操作(如INSERTUPDATEDELETE)。写操作会被阻塞。

  2. 解锁UNLOCK TABLES;

    • 执行完备份后,使用UNLOCK TABLES解除全局读锁。

三、MySQL表锁及其应用

MySQL中的表锁是对整个表加锁,保证在加锁期间,其他事务不能修改表的内容。表锁有两种主要类型:表读锁表写锁

1. 表读锁(共享锁):

通过**LOCK TABLES table_name READ**命令加表读锁。加上表读锁后,其他事务仍然可以读取该表中的数据,但不能对其进行修改(INSERTUPDATEDELETE),若事务尝试修改数据则会被阻塞。

2. 表写锁(排它锁):

通过LOCK TABLES table_name WRITE命令加表写锁。加上表写锁后,当前事务可以进行读写操作,但其他事务无法读取或修改该表。表写锁的使用场景较少,因为它会对其他事务的操作产生较大的影响。

解锁:

使用UNLOCK TABLES解除锁定。

四、MySQL行锁及其应用

行锁是MySQL提供的最精细的锁机制,锁定的是表中的单行数据。行锁包括共享锁(S锁)排它锁(X锁)

1. 共享锁(S锁):

共享锁是对某一行数据加锁,允许多个事务读取数据,但不允许其他事务修改数据。其他事务可以获取该行数据的共享锁,但不能加排它锁。

SELECT * FROM regions WHERE region_id = 13 LOCK IN SHARE MODE;

2. 排它锁(X锁):

排它锁是对某一行数据加锁,只有当前事务可以修改该行数据,其他事务无法读取或修改该行数据。排它锁通常用于事务需要更新数据时,以保证数据的一致性。

SELECT * FROM regions WHERE region_id = 13 FOR UPDATE;

行锁的应用:

行锁适用于高并发的事务处理,尤其是在数据库中需要频繁更新少量数据时。通过行锁,MySQL能够最大限度地减少事务间的冲突,提升并发性能。

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

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

相关文章

微软 GraphRAG 项目学习总结

微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》(GraphRAG:从局部到全局的查询式摘要方法)论文,提出了一种名为GraphRAG的检索增强生成(RAG)方法…

C# dataGridView 自动生成几行几列及手动输入整型字符

C# dataGridView生成12号4列的表格 private void Form1_Load(object sender, EventArgs e) {// 清除默认列dataGridView1.Columns.Clear();// 添加4列(首列为序号列)dataGridView1.Columns.Add("ColIndex", "序号");dataGridView1.…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置:我们所需的web站点,都可以利用fofa去搜索,例如:app"flask"这样的语句去找对应的站点,找到后,我们模拟不知道是什么框架,再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作,比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法:字符串变量名 [起始:结束:步长] 口诀:切片其实很简单,只顾头来…

Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外…

虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路

目录 系列文章 1. 引言 2. 常规写法mysql 3. 封装设计接口mysql 3.1dbname.py文件 3.1.1. 导入和基类定义 3.1.2. 具体表定义类 3.1.3. 表定义整合函数 3.1.4. 全局字典和测试代码 3.2mysql_dao文件 3.2.1. 模块导入与配置 3.2.2. 数据库连接池初始化 3.2.3. Comm…

MySQl之Binlog

前言 Binlog(Binary Log)是MySQL中至关重要的日志模块,它直接关系到数据恢复、主从复制等高阶架构设计。无论你是刚入门的新手还是有一定经验的开发者,掌握Binlog的原理和应用都是进阶的必经之路。 BinLog是什么? Bin…

开源项目解读(https://github.com/zjunlp/DeepKE)

1.DeepKE 是一个开源的知识图谱抽取与构建工具,支持cnSchema、低资源、长篇章、多模态的知识抽取工具,可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了文档,在线演示, 论文, 演示文稿和海报。 2.下载对应的de…

「MethodArgumentTypeMismatchException:前端传递 ‘undefined‘ 导致 Integer 类型转换失败」

遇到的问题: Failed to convert value of type java.lang.String to required type java.lang.Integer; nested exception is java.lang.NumberFormatException: For input string: "undefined" 原因分析: 大致意思就是我传递的参数到后端没…

LabVIEW故障诊断数据处理方法

在LabVIEW故障诊断系统中,数据处理直接决定诊断的准确性和效率。工业现场常面临噪声干扰、数据量大、实时性要求高等挑战,需针对性地选择处理方法。本文结合电机故障诊断、轴承损伤检测等典型案例,详解数据预处理、特征提取、模式识别三大核心…

基于 SpringBoot 的火车订票管理系统

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…

Python的概论

免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:: 提示:以下是本篇文章正文内容&#xff0c…

构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)

本系列文章目录 简介数据准备句子转换器(本文)向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中,我们学习了为RAG(检索增强生成,Retrieval Augmented Generati…

怎样提升大语言模型(LLM)回答准确率

怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…

【进阶】vscode 中使用 cmake 编译调试 C++ 工程

基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统,结合VSCode及其扩展插件( ms-vscode.cmake-tools),可实现高效的全流程C开发调试。既可通过 VSCode 可视化界面(命令面板、状态栏按钮)便捷完成配置、…

流影---开源网络流量分析平台(三)(管理引擎部署)

目录 前沿 功能介绍 部署过程 前沿 在上一篇文章中,最后因为虚拟机的资源而没看到最后的效果,而是查看了日志,虽然效果是有了,但后来我等了很久,还是那个转圈的画面,所以我猜测可能是少了什么东西&#…

QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计

目录 1.版面设计 2. 自定义按钮 2.1 自定义工具栏按钮 2.2 自定义图标按钮 3. 顶部工具栏 4. 主体 5. 底部工具栏 6. 主文件 7. 最终效果 上一章内容讲解了QML基本使用方法。本章内容继续延续“音乐播放器”项目主线,完成程序的界面设计任务。 1.版面设计…

【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance

文章目录 SpringCloud Alibaba1、核心组件2、优势3、应用场景 一、Loadbalance介绍二、Ribbon和Loadbalance 对比三、整合LoadBlance1、升级版本2、移除ribbon依赖,增加loadBalance依赖 四、自定定义负载均衡器五、重试机制六、源码分析1、猜测源码的实现2、初始化过…

06-02-自考数据结构(20331)- 查找技术-动态查找知识点

自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…

Upload-labs 靶场搭建 及一句话木马的原理与运用

1、phpstudy及upload-labs下载 (1)下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 (2)然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…