MySQL间隙锁例子详解
作为程序员,面试中被问到MySQL锁机制时,间隙锁例子是高频考点。今天就用实际场景帮你彻底搞懂这个核心概念👇
🗂️ 2025最新Java面试资源
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g

🔒 什么是间隙锁(Gap Lock)?
间隙锁是InnoDB在可重复读(RR)隔离级别下解决幻读的核心手段。它锁定的不是具体数据行,而是索引记录之间的空隙。举个典型mysql间隙锁例子:
-- 数据表: products (id主键, price)
| id | price |
|----|-------|
| 1 | 100 |
| 5 | 200 | -- 注意这里id不连续!
| 10 | 300 |
💥 高并发下的经典间隙锁例子
假设事务A执行:
BEGIN;
SELECT * FROM products
WHERE price BETWEEN 150 AND 250 FOR UPDATE;
此时事务B尝试插入:
INSERT INTO products (id, price) VALUES (3, 180); -- 阻塞!

📍 关键解析
- 事务A锁定了
price在150~250的范围间隙(对应id=1和id=5之间的区间) - 即使事务B插入的数据(id=3)原本不存在,也会被间隙锁阻塞
- 锁范围是
(1,5)这个开区间,覆盖所有可能插入150~250价格的空位
⚠️ 开发者常见误区
-
"我查空区间不会锁吧?"
SELECT * FROM products WHERE id=3 FOR UPDATE; -- 不存在id=3依然会锁
(1,5)这个间隙! -
"主键连续就不会有间隙锁?"
即使主键连续,范围查询如id>10仍会锁(10, +∞)的间隙
💡 面试突围技巧
当面试官要求你手写mysql间隙锁例子时,务必强调:
- 必须RR隔离级别 + 非唯一索引
- 范围查询(BETWEEN, >, <)是触发条件
- 重点说明锁的是"可能插入的位置",不是现有数据
如果你正在准备技术面试,强烈建议看看面试鸭会员。通过面试鸭返利网找我购买会员可返25元,覆盖近3年大厂真题库和模拟面试系统👇
🛠️ 如何规避间隙锁问题?
- 读操作用
READ COMMITTED隔离级别 - 写操作尽量用唯一索引精确匹配
- 控制事务粒度,避免长事务持有锁
理解mysql间隙锁例子的本质,才能设计出高并发的数据库方案。遇到生产环境死锁别慌,先检查SHOW ENGINE INNODB STATUS里的锁等待链!



