MySQL 锁机制全景图:分类、粒度与示例一图掌握

news2025/4/19 21:50:41

✅ 一、按粒度分类(锁的范围大小)

1. 表级锁(Table Lock)

  • 锁住整张表
  • 粒度大,开销小,并发性差
  • 常见于:MyISAM 引擎

📌 示例:

LOCK TABLES user WRITE;
-- 会锁住整个 user 表,其他线程无法写入

2. 行级锁(Row Lock)

  • 锁住一行数据
  • 粒度小,开销大,并发性高
  • 常见于:InnoDB 引擎

📌 示例:

BEGIN;
SELECT * FROM user WHERE id = 1 FOR UPDATE;
-- 只锁住 id=1 的那一行

3. 页级锁(Page Lock)

  • 锁住一页数据(介于表锁与行锁之间)
  • MySQL 不常用,常见于某些数据库如 Oracle、SQL Server
  • MySQL 中的 BDB 引擎 支持

✅ 二、按锁的类型分类(访问行为)

1. 共享锁(Shared Lock / S 锁)

  • 允许多个事务同时读取一行,不能写
  • 用于实现并发读取一致性

📌 示例:

SELECT * FROM user WHERE id = 1 LOCK IN SHARE MODE;

2. 排他锁(Exclusive Lock / X 锁)

  • 只允许一个事务读取 + 修改,不能有其它事务访问
  • 修改数据前必须加排他锁

📌 示例:

SELECT * FROM user WHERE id = 1 FOR UPDATE;

✅ 三、InnoDB 引擎中的特殊锁

1. 意向锁(Intention Lock)

  • InnoDB 为了支持多粒度锁并存而引入的机制,自动加锁,无需手动控制。
  • 分为:
    • 意向共享锁(IS)
    • 意向排他锁(IX)

✅ 作用:告诉系统“我要在某些行上加 S 锁/X 锁”,避免和表锁冲突。


2. Gap Lock(间隙锁)

  • 锁住一个“值之间的范围”
  • 典型场景:防止幻读

📌 示例:

SELECT * FROM user WHERE age > 18 FOR UPDATE;
-- 锁住所有满足 age > 18 的“间隙”

3. Next-Key Lock(临键锁)

  • Gap Lock + 行锁 的组合
  • 也用于防止幻读

4. Record Lock(记录锁)

  • 真正只锁住一行
  • 是最基础的行锁形式

✅ 四、全局锁(Global Lock)

  • 通常用于备份全库时加锁
  • 会锁住整个数据库实例,不建议在线使用

📌 示例:

FLUSH TABLES WITH READ LOCK;

✅ 五、按加锁机制划分:

1、乐观锁

乐观锁基于这样的假设:冲突在系统中出现的频率较低,因此在数据库事务执行过程中,不会频繁地去锁定资源。相反,它在提交更新的时候才检查是否有其他事务已经修改了数据。

可以通过在数据表中使用版本号(Version)或时间戳(Timestamp)来实现,每次读取记录时,同时获取版本号或时间戳,更新时检查版本号或时间戳是否发生变化。

如果没有变化,则执行更新并增加版本号或更新时间戳;如果检测到冲突(即版本号或时间戳与之前读取的不同),则拒绝更新。


2、悲观锁

悲观锁假设冲突是常见的,因此在数据处理过程中,它会主动锁定数据,防止其他事务进行修改

可以直接使用数据库的锁机制,如行锁或表锁,来锁定被访问的数据。常见的实现是 SELECT FOR UPDATE 语句,它在读取数据时就加上了锁,直到当前事务提交或回滚后才释放。


举例:如何解决库存超卖问题?

按照乐观锁的方式:
使用 UPDATE ... WHERE 结合版本号 / 库存条件,如果更新失败,说明有竞争,重试操作

UPDATE inventory SET count = count - 1, version = version + 1 WHERE product_id = 1 AND version = current_version;

按照悲观锁的方式:
使用 SELECT ... FOR UPDATE 加排他锁,确保当前事务结束前,其他事务无法修改数据。

START TRANSACTION;
SELECT * FROM inventory WHERE product_id = 1 FOR UPDATE;
UPDATE inventory SET count = count - 1 WHERE product_id = 1;
COMMIT;

🧠 面试高频陷阱

问题易错理解正确认识
SELECT * FROM table WHERE id = 1 会加锁吗?会加锁❌ 默认不会加锁,除非加 FOR UPDATE
行锁一定是锁一行?是的❌ 有可能是间隙锁或临键锁
MyISAM 支持事务和行锁?支持❌ MyISAM 不支持事务,也不支持行锁

🔐 MySQL 锁分类总览图(Mermaid Mindmap)


🧠 图示说明:

  • 四大主干维度:按照粒度行为类型InnoDB 特性特殊用法分类;
  • 每种锁都附有简要描述使用示例,方便记忆;
  • 特别标出 InnoDB 专属锁机制,面试考频高。

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

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

相关文章

STM32江科大----------PID算法

声明:本人跟随b站江科大学习,本文章是观看完视频后的一些个人总结和经验分享,也同时为了方便日后的复习,如果有错误请各位大佬指出,如果对你有帮助可以点个赞小小鼓励一下,本文章建议配合原视频使用❤️ 如…

架构师面试(二十九):TCP Socket 编程

问题 今天考察网络编程的基础知识。 在基于 TCP 协议的网络 【socket 编程】中可能会遇到很多异常,在下面的相关描述中说法正确的有哪几项呢? A. 在建立连接被拒绝时,有可能是因为网络不通或地址错误或 server 端对应端口未被监听&#x…

基础学习(4): Batch Norm / Layer Norm / Instance Norm / Group Norm

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1 batch normalization(BN)2 Layer normalization (LN)3 instance normalization (IN)4 group normalization (GN)总结 前言 对 norm/batch/instance/group 这…

Idea集成AI:CodeGeeX开发

当入职新公司,或者调到新项目组进行开发时,需要快速熟悉项目代码 而新的项目代码,可能有很多模块,很多的接口,很复杂的业务逻辑,更加有与之前自己的代码风格不一致的现有复杂代码 更别提很多人写代码不喜…

HTTP HTTPS RSA

推荐阅读 小林coding HTTP篇 文章目录 HTTP 80HTTP 响应码1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端…

【深度学习与大模型基础】第10章-期望、方差和协方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解为“长期的平均值”。比如: 掷骰子:一个6面骰子的点数是1~6&#x…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端,用于管理 Elasticsearch 集群中的数据,完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色: 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

【python】OpenCV—Tracking(10.6)—People Counting

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考来自 更多有趣的代码示例,可参考【Programming】 1、功能描述 借助 opencv-python,用 SSD 人形检测模型和质心跟踪方法实现对人群的计数 基于质心的跟踪可以参考 【pyt…

使用KeilAssistant代替keil的UI界面

目录 一、keil Assistant的优势和缺点 二、使用方法 (1)配置keil的路径 (2)导入并使用工程 (3)默认使用keil自带的ARM编译器而非GUN工具链 一、keil Assistant的优势和缺点 在日常学…

FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现

目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道,任…

JBOSS反序列化漏洞解析与防范策略CVE-2017-12149

JBOSS反序列化漏洞解析与防范策略 引言 JBOSS是一个流行的开源应用服务器,广泛应用于企业级应用程序的开发和部署。然而,由于其广泛的使用和复杂的架构,JBOSS也成为了黑客攻击的常见目标。近年来,多个JBOSS漏洞被曝光&#xff0…

Web3技术下数字资产数据保护的实践探索

在这个信息爆炸的时代,数字资产已经成为我们生活中不可或缺的一部分。随着Web3技术的兴起,它以其去中心化、透明性和安全性的特点,为数字资产的管理和保护提供了新的解决方案。本文将探讨Web3技术在数字资产数据保护方面的实践探索&#xff0…

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…

Rust-引用借用规则

目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…

如何保障企业数据的安全?软件开发中的数据安全防护措施

引言 随着数字化转型的推进,数据已经成为企业最重要的资产之一。然而,随着数据量的增长,数据泄露、丢失和滥用的风险也不断增加。如何保障企业数据的安全,成为企业在进行软件开发时必须重点关注的问题。本文将介绍软件开发中的一些…

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html

【软件工程大系】净室软件工程

净室软件工程(Cleanroom Software Engineering)是一种以缺陷预防(正确性验证)为核心的软件开发方法,旨在通过严格的工程规范和数学验证,在开发过程中避免缺陷的产生,而非依赖后期的测试和调试。…

软考 系统架构设计师系列知识点之杂项集萃(49)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(48) 第76题 某文件管理系统在磁盘上建立了位视图(bitmap),记录磁盘的使用情况。若磁盘上物理块的编号依次为:0、1、2、……&#xff1b…

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…