MySQL 意向锁为什么不会阻塞行锁之间的并发?
- [MySQL 意向锁为什么不会阻塞行锁之间的并发?](#MySQL 意向锁为什么不会阻塞行锁之间的并发?)
- 一、先说结论
- [二、InnoDB 为什么需要意向锁?](#二、InnoDB 为什么需要意向锁?)
-
-
- [👉 多粒度锁模型(Multi Granularity Locking)](#👉 多粒度锁模型(Multi Granularity Locking))
- 如果没有意向锁会发生什么?
- 有意向锁后
-
- 三、意向锁是什么?
-
-
- [👉 "声明型锁"](#👉 “声明型锁”)
-
- 四、意向锁类型
- 五、重点:意向锁不会参与行锁竞争
- 六、什么时候才会被阻塞?
- 七、兼容矩阵
- 八、很多人为什么会误解?
- 九、真正影响行并发的是什么?
-
-
- [① 行锁冲突](#① 行锁冲突)
- [② 间隙锁](#② 间隙锁)
- [③ Next-Key Lock](#③ Next-Key Lock)
- [④ MVCC 可见性](#④ MVCC 可见性)
-
- [十、DBA 生产经验总结](#十、DBA 生产经验总结)
- 十一、底层设计哲学(非常关键)
-
-
- [👉 用极低成本解决表锁检测问题](#👉 用极低成本解决表锁检测问题)
-
- 十二、面试一句话总结
- 十三、一句话理解
MySQL 意向锁为什么不会阻塞行锁之间的并发?
在 MySQL InnoDB 锁体系中,很多人第一次看到**意向锁(Intention Lock)**都会产生一个误解:
表上都加锁了,那是不是会影响行锁并发?
实际上:
✅ 意向锁不会阻塞行锁之间的并发
✅ 意向锁只参与表锁冲突判断
❌ 它不是用来控制行并发的锁
本文从设计背景 → 锁模型 → 执行流程 → 本质原理 → 生产实践一步一步讲清楚。
一、先说结论
意向锁存在的目的只有一个:
提高表锁与行锁冲突检测效率
而不是:
控制行锁并发
二、InnoDB 为什么需要意向锁?
因为 InnoDB 支持:
- 表锁
- 行锁
- 两者同时存在
这叫:
👉 多粒度锁模型(Multi Granularity Locking)
如果没有意向锁会发生什么?
假设有人执行:
sql
LOCK TABLE user READ;
数据库必须检查:
这张表有没有行锁?
如果没有意向锁,就只能:
扫描整张表的所有行锁
复杂度:
O(行数)
有意向锁后
只需要看:
表级有没有 IX / IS
复杂度:
O(1)
这就是意向锁存在的根本原因。
三、意向锁是什么?
本质是一种:
👉 "声明型锁"
告诉数据库:
我准备在某些行上加锁
而不是:
我要锁整张表
四、意向锁类型
| 锁类型 | 含义 |
|---|---|
| IS | 准备加行共享锁 |
| IX | 准备加行排他锁 |
五、重点:意向锁不会参与行锁竞争
这是整篇文章最关键点。
行锁并发流程
事务 A
sql
SELECT * FROM user WHERE id = 1 FOR UPDATE;
发生:
表:加 IX
行:id=1 加 X
事务 B
sql
SELECT * FROM user WHERE id = 2 FOR UPDATE;
发生:
表:加 IX
行:id=2 加 X
是否冲突?
表锁层面
IX vs IX → 兼容
行锁层面
X(id=1) vs X(id=2) → 不冲突
最终结果
两个事务完全可以并发执行。
六、什么时候才会被阻塞?
只有在涉及表锁时。
例如:
sql
LOCK TABLE user WRITE;
此时需要表级 X 锁。
如果已有:
IX 表锁存在
那么:
表X锁 ← 会被阻塞
七、兼容矩阵
| IS | IX | S表锁 | X表锁 | |
|---|---|---|---|---|
| IS | ✔ | ✔ | ✔ | ❌ |
| IX | ✔ | ✔ | ❌ | ❌ |
八、很多人为什么会误解?
因为看到:
行锁前 → 先加表锁(意向锁)
就以为:
表被锁了 → 并发下降
但实际上:
意向锁不是资源锁,而是状态标记
它类似:
元信息锁提示
而不是:
真正锁资源
九、真正影响行并发的是什么?
在生产中真正影响并发的是:
① 行锁冲突
同一行 X vs X
② 间隙锁
范围锁定
③ Next-Key Lock
行 + 间隙组合锁
④ MVCC 可见性
版本判断导致等待
十、DBA 生产经验总结
在高并发 OLTP 场景:
几乎可以忽略意向锁性能影响
因为:
IX 和 IX 永远兼容
只有在:
- LOCK TABLE
- DDL 操作
- 元数据锁竞争
时才明显出现。
十一、底层设计哲学(非常关键)
意向锁设计思想:
👉 用极低成本解决表锁检测问题
如果没有意向锁:
表锁检测 = 扫描所有行锁
有意向锁:
表锁检测 = 看一个标记
十二、面试一句话总结
如果面试官问:
意向锁为什么不影响行并发?
可以回答:
意向锁只是表级声明锁,用于快速判断表锁与行锁冲突,不参与行锁资源竞争,因此不会影响行锁并发。
十三、一句话理解
记住一句话:
意向锁是给数据库看的,不是给业务并发用的。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/157512232