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

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

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

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 专属锁机制,面试考频高。

相关文章:

  • 每天记录一道Java面试题---day39
  • Web自动化测试的详细流程和步骤
  • shell编程正则表达式与文本处理器
  • 显示模组Bonding IC气泡问题
  • bert项目解析
  • uniapp实现图文聊天功能
  • java-spring笔记
  • HackMyVM Gigachad.
  • 《MySQL基础:了解MySQL周边概念》
  • MySQL 慢查询日志深入分析与工具实战(mysqldumpslow pt-query-digest)
  • 分层式设备控制架构、分布式微服务架构及插件化架构
  • 加密软件:数字时代的隐私守护者
  • 再论火车实验-8
  • 教程:批量提取图片pdf固定位置文字然后保存为新的文件名,基于Python和阿里云的实现方案
  • 大数据面试问答-HBase/ClickHouse
  • javaSE.走进泛型. 泛型类
  • wpf ScaleTransform
  • DeepSeek大模型微调技术PEFT与LoRA详解
  • 大模型落地的关键:如何用 RAG 打造更智能的 AI 搜索——阿里云 AI 搜索开放平台
  • 高等数学A1 期末救济(导数)
  • 手机云电脑/seo下拉优化
  • 做网站包括什么条件/佛山网站建设十年乐云seo
  • 沈阳市建设局网站首页/谷歌搜索引擎免费入口镜像
  • 深圳市龙岗区建设局官网网站/百度热搜榜排名今日p2p
  • 交换机可以做网站跳转吗/百度关键词竞价价格
  • 免费做司考真题的网站/近期国际热点大事件