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

MYSQL--再谈间隙锁和临键锁

✅ 表结构和数据如下:

CREATE TABLE users (id INT PRIMARY KEY,score INT,INDEX idx_score(score)
);
idscore
10100
20200
30300
40400
50500
60600
70700
80800
90900


🔒 加锁行为分析表(总览)

#SQL使用索引匹配锁类型锁定范围(主键/score)
1id = 30主键命中记录锁[30]
2id = 35主键无匹配间隙锁(30, 40)
3score = 300二级索引命中记录锁 + 回表[300](idx_score),id=30(主键)
4score = 350二级索引无匹配间隙锁(300, 400)
5id > 30 AND id < 60主键命中临键锁(30,40), [40,50), (50,60)
6id > 35 AND id < 60主键命中临键锁(30,40), [40,50], [50,60)
7score > 300 AND score < 600二级索引命中临键锁 + 回表(300,400), [400,500), [500,600)
8score > 350 AND score < 600二级索引命中临键锁 + 回表(300,400), [400,500), [500,600)
9id > 30主键命中临键锁(30,40), [40,50), [50,60), [60,70), [70,80), [80,90), [90,+∞)
10id > 35主键命中临键锁(30,40), [40,50), [50,60), [60,70), [70,80), [80,90), [90,+∞)
11score > 300二级索引命中临键锁 + 回表(300,400], (400,500], (500,600], (600,700], (700,800], (800,900], (900,+∞)
12score > 350二级索引命中临键锁 + 回表(300,400], (400,500], (500,600], (600,700], (700,800], (800,900], (900,+∞)

📘 每条 SQL 详解(带图形)


🔹 1. SELECT * FROM users WHERE id = 30 FOR UPDATE;

  • ✅ 主键等值查询,唯一索引 → 只加记录锁

  • ✅ 锁住 [30]


🔹 2. SELECT * FROM users WHERE id = 35 FOR UPDATE;

  • 🔍 主键范围查找,未命中 → 加间隙锁

  • ✅ 锁住间隙 (30, 40),防止插入 35


🔹 3. SELECT * FROM users WHERE score = 300 FOR UPDATE;

  • 🔍 二级索引命中 → 加记录锁(score=300)+ 回表锁(id=30)

  • ✅ 锁住:

    • [300](在 idx_score 上)

    • [30](主键)


🔹 4. SELECT * FROM users WHERE score = 350 FOR UPDATE;

  • 🔍 二级索引未命中 → 加间隙锁

  • ✅ 锁住 (300, 400)(在 idx_score 上)


🔹 5. SELECT * FROM users WHERE id > 30 AND id < 60 FOR UPDATE;

  • 🔍 主键范围 → 临键锁(Next-Key)

  • ✅ 锁住:

    • (30,40)-->是间隙锁

    • [40,50)-->是临键锁{就相当于间隙锁(40,50)+行锁[40]}

    • [50,60)-->是临键锁{就相当于间隙锁(50,60)+行锁[50]}


🔹 6. SELECT * FROM users WHERE id > 35 AND id < 60 FOR UPDATE;

  • 🔍 主键范围(不命中30,但间隙要锁)→ 临键锁

  • ✅ 锁住:

    • (30,40)(间隙)

    • [40,50)

    • [50,60)


🔹 7. SELECT * FROM users WHERE score > 300 AND score < 600 FOR UPDATE;

  • 🔍 二级索引范围查询 → 临键锁

  • ✅ 锁住:

    • (300, 400)

    • [400, 500)

    • [500, 600)(只锁 gap)

  • 加主键回表锁:id=40, 50


🔹 8. SELECT * FROM users WHERE score > 350 AND score < 600 FOR UPDATE;

  • 🔍 二级索引范围查询 → 临键锁

  • ✅ 锁住:

    • (300, 400)(350 落在这里)

    • [400, 500)

    • [500, 600)

  • 加主键回表锁:id=40, 50


🔹 9. SELECT * FROM users WHERE id > 30 FOR UPDATE;

  • 🔍 主键范围 → 临键锁

  • ✅ 锁住全部后继区间:

    • (30,40), [40,50), [50,60), [60,70), [70,80), [80,90), [90,+∞)


🔹 10. SELECT * FROM users WHERE id > 35 FOR UPDATE;

  • 🔍 主键范围 → 临键锁

  • ✅ 锁住:

    • (30,40)(间隙锁,35 落在这里)

    • [40,50), [50,60), [60,70), [70,80), [80,90), [90,+∞)


🔹 11. SELECT * FROM users WHERE score > 300 FOR UPDATE;

  • 🔍 二级索引范围 → 临键锁 + 回表

  • ✅ 锁住:

    • (300,400), [400,500), [500,600), [600,700), [700,800), [800,900), [900,+∞)

  • 回表主键加锁:id=40, 50, 60, 70, 80, 90


🔹 12. SELECT * FROM users WHERE score > 350 FOR UPDATE;

  • 🔍 二级索引范围 → 临键锁 + 回表

  • ✅ 锁住:

    • (300,400)(350 落在这里)

    • [400,500), [500,600), [600,700), [700,800), [800,900), [900,+∞)

  • 回表主键加锁:id=40, 50, 60, 70, 80, 90


🧠 Tips 小结

锁类型特征
记录锁精确匹配唯一值(主键或唯一索引)
间隙锁精确匹配失败 + 非唯一索引或主键 → 锁住相邻 gap
临键锁(Next-Key Lock)范围查询 → 锁住记录 + 相邻间隙(组合锁)
http://www.xdnf.cn/news/1195705.html

相关文章:

  • RabbitMq 常用命令和REST API
  • 商品中心—1.B端建品和C端缓存
  • Python-初学openCV——图像预处理(四)——滤波器
  • 命令行和neovim的git操作软件-lazygit
  • sealos 方式安装k8s5节点集群
  • 自动标注软件X-AnyLabeling的使用教程
  • 基于动态增强的 LLM 置信度方法研究
  • C语言中:形参与实参的那些事
  • [SAP ABAP] ALV报表练习4
  • Matlab自学笔记六十五:解方程的数值解法(代码速成)
  • 文件IO——bmp图像处理
  • 磁悬浮轴承转子不平衡质量控制策略设计:原理、分析与智能实现
  • 基于java的在线教育平台管理系统、在线学习系统的设计与实现
  • 零基础学习性能测试第三章:jmeter性能组件应用(事件,并发,定时器)
  • 哈尔滨←→南昌的铁路要道
  • AWD的攻击和防御手段
  • idea中无法删除模块,只能remove?
  • 2025年7月26日训练日志
  • 最优估计准则与方法(4)最小二乘估计(LS)_学习笔记
  • 幸福网咖订座点餐小程序的设计与实现
  • element-plus安装以及使用
  • 《基于雅可比矢量近似的EIT触觉传感灵敏度非均匀校正》论文解读
  • 微分方程入门之入门之入门,纯笔记
  • 实现网页访问/接口调用KernelMemory
  • S7-200 SMART 数字量 I/O 组态指南:从参数设置到实战案例
  • Ubuntu系统 系统盘和数据盘扩容具体操作
  • C++类和对象(三)
  • Coze 与 Dify 深度对比:2025 年 AI 智能体平台选型指南
  • VMware Workstation17下安装Ubuntu20.04
  • JVM-GC 相关知识