当前位置: 首页 > article >正文

深入理解 MySQL 锁:基于 InnoDB 的并发控制解析

在这里插入图片描述

在数据库并发访问管理中,MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB,为 MySQL 带来了细粒度的锁控制,使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响,重点聚焦 InnoDB 引擎。


为什么需要锁?

锁是数据库并发控制的核心。它们通过限制多个事务之间的相互干扰,防止数据损坏。然而,锁的使用是一把双刃剑:锁越多,阻塞越多,高并发场景下的性能可能因此下降。InnoDB 通过支持多种锁类型和粒度,平衡了并发性与系统开销。


锁的分类

MySQL 的锁可以从不同角度进行分类,以下是三种主要分类方式:

1. 独享锁与共享锁

  • 独享锁(X 锁 / 写锁):锁定的数据仅允许持有锁的事务操作,其他事务无法读写。使用方式:SELECT ... FOR UPDATE;
  • 共享锁(S 锁 / 读锁):允许多个事务读取数据,但禁止修改。使用方式:SELECT ... LOCK IN SHARE MODE;

读写锁的意义
读操作通常是线程安全的,且业务往往读多写少。如果读操作也互斥,会严重降低并发效率。因此,读写锁遵循“读读不互斥、读写互斥、写写互斥”的原则,优化了性能。

2. 悲观锁与乐观锁

  • 悲观锁:假设冲突不可避免,查询时即加锁,直到事务提交才释放。依赖数据库锁机制实现。
  • 乐观锁:假设数据不会被修改,仅在更新时检查冲突(如版本号或 CAS 算法)。无需加锁,提升并发度,但可能因重试导致 CPU 开销。

示例 - 乐观锁
假设 order 表中 status 表示订单状态,version 为版本号:

SELECT status, version FROM order WHERE id = 1;
UPDATE order SET status = 2, version = version + 1 WHERE id = 1 AND version = #{version};

3. 全局锁、表级锁与行级锁

根据锁的范围,分为:

  • 全局锁:锁定整个数据库,典型场景为全库备份(FLUSH TABLES WITH READ LOCK)。
  • 表级锁:锁定整张表,常见于 MyISAM 或 InnoDB 的表锁、元数据锁(MDL)、意向锁等。
  • 行级锁:锁定特定行,InnoDB 的核心特性,支持记录锁、间隙锁等。

锁粒度权衡
锁粒度越小(如行锁),并发度越高,但锁操作开销越大;粒度越大(如表锁),开销小,但并发性降低。


全局锁详解

全局锁通过 FLUSH TABLES WITH READ LOCK 命令锁定整个数据库,使其只读,常用于全库逻辑备份。释放锁使用 UNLOCK TABLES,或在客户端断开时自动释放。

使用场景
使用 mysqldump --single-transaction 备份 InnoDB 表时,利用 MVCC 实现一致性视图,无需全局锁。但对于不支持事务的引擎,只能依赖全局锁。


表级锁详解

表级锁锁定整张表,分为以下几种:

1. 表锁

通过 LOCK TABLES ... READ/WRITE 实现,粒度大、开销小,但并发度低。常用于不支持行锁的引擎(如 MyISAM)。

2. 元数据锁(MDL)

MDL 自动应用于表操作:

  • 增删改查加读锁,读锁间不互斥。
  • 结构变更加写锁,读写互斥。

注意:长事务可能导致 MDL 阻塞,影响线上操作。

3. 意向锁(Intention Lock)

表级锁,表明事务对行的锁意图:

  • IS 锁:意向共享锁。
  • IX 锁:意向独享锁。

作用:快速判断表是否有行锁,避免逐行检查。

4. 自增锁(AUTO-INC)

AUTO_INCREMENT 字段赋值时使用,轻量级锁在插入后立即释放,提升插入性能。


行级锁详解

InnoDB 的行锁通过索引实现,支持以下类型:

1. 记录锁(Record Lock)

锁定索引记录本身,如 SELECT ... FOR UPDATE 可锁定特定行。

2. 间隙锁(Gap Lock)

锁定索引间的间隙,防止幻读,仅在可重复读隔离级别生效。

3. 临键锁(Next-Key Lock)

记录锁与间隙锁的组合,锁定前开后闭区间,解决幻读问题。

4. 插入意向锁

插入操作时,若间隙被锁,生成此锁并等待,避免冲突。


死锁与解决之道

死锁:多个事务竞争资源,互相等待形成循环。

示例
事务 A 锁定行 1 并等待行 2,事务 B 锁定行 2 并等待行 1,导致死锁。

避免死锁

  • 使用主键更新,减少锁冲突。
  • 拆分长事务。
  • 设置锁等待超时(如 innodb_lock_wait_timeout)。

解决死锁

  • 主动检测(innodb_deadlock_detect = on),回滚持有最少锁的事务。

结语

MySQL 的锁机制为开发者提供了灵活的并发控制工具。理解独享锁与共享锁、悲观锁与乐观锁,以及不同粒度的锁(如全局、表级、行级),有助于在性能与一致性间找到平衡。无论是优化高并发场景,还是避免死锁,合理使用锁都是关键。

相关文章:

深入理解 MySQL 锁:基于 InnoDB 的并发控制解析

在数据库并发访问管理中,MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB,为 MySQL 带来了细粒度的锁控制,使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响&…...

Linux Nginx安装部署、注册服务

1、下载:https://nginx.org/en/download.html 下载nginx-1.27.4.tar.gz,上传到服务器 /opt/目录 在开始安装Nginx之前,首先需要安装一些依赖项,以确保Nginx编译和运行正常。打开终端并执行以下命令: yum install -y …...

安全的实现数据备份和恢复

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...

PGSQL基本使用

PGSQL基本使用 文章目录 PGSQL基本使用日期转换长度不够补数获取上下行取连续的开始和结束的值 日期转换 格式说明YYYY年MM月DD日hh2424小时制mi分钟ss秒 -- 日期字符串转指定日期字符串 -- 20250101123000 转为 2025-01-01 12:30:00 select to_char(to_timestamp(2025010112…...

excel中两个表格的合并

使用函数: VLOOKUP函数 如果涉及在excel中两个工作表之间进行配对合并,则: VLOOKUP(C1,工作表名字!A:B,2,0) 参考: excel表格中vlookup函数的使用方法步骤https://haokan.baidu.com/v?pdwisenatural&vid132733503560775…...

在 Windows 上快速部署 OpenManus:从安装到运行

在当今快速发展的 AI 领域,OpenManus 作为一个强大的开源工具,为开发者提供了便捷的 AI 应用开发体验。本文将详细介绍如何在 Windows 系统上安装并运行 OpenManus,帮助你快速搭建一个本地的 AI 开发环境。 一、安装 Anaconda Anaconda 是一…...

NLP常见任务专题介绍(4)-ConditionalGeneration和CasualLM区别

在 transformers 库中,ConditionalGeneration 和 CausalLM 是两种不同类型的语言模型,各自适用于不同的任务: 类别Conditional Generation (条件生成)CausalLM (因果语言模型)核心区别依赖输入 条件 生成文本只能 自回归 生成文本训练方式Encoder-Decoder(编码-解码) 结构…...

uniapp实现 uview1 u-button的水波纹效果

说明&#xff1a; 由于uview2已经移除水波纹效果&#xff0c;这边又觉得那个效果好看&#xff0c;所以开发这个功能(原谅我不会录动图) 效果&#xff1a; 具体代码&#xff1a; <view class"ripple-container" touchstart"handleTouchStart" touchend&…...

RabbitMQ报错:Shutdown Signal channel error; protocol method

报错信息&#xff1a; Shutdown Signal: channel error; protocol method: #method<channel.close>(reply-code406, reply-textPRECONDITION_FAILED - unknown delivery tag 1, class-id60, method-id80) 原因 默认情况下 RabbitMQ 是自动ACK&#xff08;确认签收&…...

modbusrtu.h:5:10: error: ‘QSerialPort‘ file not found

解决 QSerialPort 头文件未找到的问题: 1. 确保已安装 Qt Serial Port 模块 QSerialPort 属于 Qt Serial Port 模块,需先确认已安装该模块。 安装步骤: 打开 Qt Maintenance Tool: 在开始菜单搜索并打开 Qt Maintenance Tool 选择当前安装的 Qt 版本,点击 “添加或移除…...

【后端】【django】导出 API 文档的几种方法

在 Django 项目里&#xff0c;导出 API 文档是很常见的需求&#xff0c;一般可以借助第三方库来实现。 使用 drf-yasg 导出 Swagger/OpenAPI 格式文档 drf-yasg 是一个用于 Django REST framework 的工具&#xff0c;能够自动生成 Swagger 和 OpenAPI 格式的 API 文档。 步骤…...

【Rust基础】Rust后端开发常用库

使用Rust有一段时间了&#xff0c;期间尝试过使用Rust做后端开发、命令行工具开发&#xff0c;以及做端侧模型部署&#xff0c;也尝试过交叉编译、FFI调用等&#xff0c;也算是基本入门了。在用Rust做后端接口开发时&#xff0c;常常会找不到一些合适库&#xff0c;而这些库在J…...

如何使用Cursor的claude-3.7模型来开发高保真的原型设计图,学会写好的提示词人人都是设计师

1、想要开发出高保真的设计图原型&#xff0c;需要给出cursor具体的提示词&#xff1a;比如我想开发一款IT面试题小程序&#xff0c;给出的提示词是这样的 我想开发一个 {IT面试题库小程序}&#xff0c;现在需要输出高保真的原型图&#xff0c;请通过以下方式帮我完成所有界面…...

AGI大模型(5):提示词工程

1 什么是提示词工程&#xff08;Prompt&#xff09; 所谓的提示词其实指的就是提供给模型的⼀个⽂本⽚段&#xff0c;⽤于指导模型⽣成特定的输出或回答。提示词的⽬的是为模型提供⼀个任务的上下⽂&#xff0c;以便模型能够更准确地理解⽤户的意图&#xff0c;并⽣成相关的回…...

Redis Sentinel (哨兵模式)深度解析:构建高可用分布式缓存系统的核心机制

一、传统主从复制的痛点 在分布式系统架构中&#xff0c;Redis 作为高性能缓存和数据存储解决方案&#xff0c;其可用性直接关系到整个系统的稳定性。传统的主从复制架构虽然实现了数据冗余&#xff0c;但在面临节点故障时仍存在明显缺陷&#xff1a; ​手动故障转移&#xf…...

微信小程序-实现锚点跳转,页面加载后自动跳转、点击跳转到指定位置

一、页面加载后滚动到指定位置&#xff0c;onLoad或onReady里执行。 scrollAfterLoading() {const query wx.createSelectorQuery()query.select(#cont1).boundingClientRect()query.selectViewport().scrollOffset()query.exec(function (res) {wx.pageScrollTo({scrollTop:…...

[LeetCode热门100题]|137,260,268,面试17.19

1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…...

Android子线程更新View的方法原理

对于所有的Android开发者来说&#xff0c;“View的更新必须在UI线程中进行”是一项最基本常识。 如果不在UI线程中更新View&#xff0c;系统会抛出CalledFromWrongThreadException异常。那么有没有什么办法可以不在UI线程中更新View&#xff1f;答案当然是有的&#xff01; 一…...

Kafka常用指令(详细)

Kafka常用指令&#xff08;详细&#xff09; 启停命令 前台启动 前台启动命令 ./bin/kafka-server-start.sh config/server.properties 后台启动方式1 后台启动命令加上参数-daemon&#xff0c;窗口关闭之后kafka后台程序继续运行 ./bin/kafka-server-start.sh -daemon co…...

Golang Channel 使用详解、注意事项与死锁分析

#作者&#xff1a;西门吹雪 文章目录 一、引言&#xff1a;Channel 在 Go 并发编程中的关键地位二、Channel 基础概念深度剖析2.1 独特特性2.2 类型与分类细解 三、Channel 基本使用实操指南3.1 声明与初始化3.3 单向 Channel 的运用 四、Channel 典型使用场景实战案例4.1 协程…...

使用LiteFlow实现阻塞审批工作流

在 LiteFlow 中实现阻塞的审批工作流&#xff0c;你可以使用异步处理与同步逻辑结合&#xff0c;实现节点的等待 使用 LiteFlow 实现阻塞审批工作流 下面是如何实现一个带有阻塞审批功能的 LiteFlow 工作流示例。 1. 引入依赖 确保您的 pom.xml 文件中已引入 LiteFlow 和 S…...

2025移动端软件供应链安全开源治理方案最佳实践

2025年3月13日&#xff0c;由中国软件评测中心、CAPPVD漏洞库联合主办的“第六期移动互联网APP产品安全漏洞技术沙龙”在海口成功召开。悬镜安全基于移动端数字供应链安全开源治理方案荣获中国软件评测中心“2024移动互联网APP产品安全漏洞治理”优秀案例&#xff0c;并获颁证书…...

Git Fast-forward 合并详解:原理、场景与最佳实践

在使用 Git 进行团队协作时&#xff0c;我们经常需要合并分支。合并方式有很多种&#xff0c;其中 Fast-forward&#xff08;快速合并&#xff09; 是一种最简单且无冲突的合并方式。本文将详细介绍 Fast-forward 的原理、适用场景、常见问题及最佳实践。 一、Fast-forward 合并…...

《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

文章目录 一、引言二、SPI总线协议的基本原理三、SPI通信模式详解 —— CPOL与CPHA3.1 时钟极性&#xff08;CPOL&#xff09;3.2 时钟相位&#xff08;CPHA&#xff09;3.3 四种SPI模式 四、主从设备通信机制4.1 通信流程概述4.2 数据帧结构与传输细节4.3 主设备与从设备的协同…...

vscode出现:No module named ‘requests‘ 问题的解决方法

问题&#xff1a; ① No module named requests ② pip install requests&#xff1a;显示已经安装成功 运行失败原因&#xff1a; 我的失败原因是因为&#xff1a;我的python环境有两个&#xff0c;电脑C盘默认一个、pycharm下载后在它的路径下有一个。而vscode所运行的环境…...

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…...

Docker Compose 使用笔记

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具&#xff1b; docker-compose.yml 文件则是 Docker Compose 用来配置应用服务的核心文件&#xff0c;它以 YAML 格式编写。 YAML 文件用途&#xff1a; 服务定义&#xff1a;在 docker-compose.yml 文件中&…...

雷池WAF 处理 HTTP 请求的流程

项目介绍 SafeLine&#xff0c;中文名 "雷池"&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、…...

JAVA-Thread类实现多线程

引言&#xff1a; 本章博客涉及进程线程内容&#xff0c;如果不了解的可以看&#xff1a;什么是进程线程-CSDN博客 线程是操作系统的概念&#xff0c;操作系统提供的API供程序员使用操作。但是不同的操作系统(Winodws、Linux、Unix……差别很大),但是做为JAVA程序员就不需要担心…...

【算法】DFS、BFS、拓扑排序

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...