MySQL数据库 意向锁(初篇)
-
- 一、为什么需要意向锁?
- 二、意向锁的类型
- 三、意向锁的工作机制
-
- [1️⃣ 加行锁前,先加意向锁(表级)](#1️⃣ 加行锁前,先加意向锁(表级))
- [2️⃣ 锁兼容关系(重点)](#2️⃣ 锁兼容关系(重点))
- 四、举例说明(非常重要)
-
- [示例 1:行锁 + 意向锁](#示例 1:行锁 + 意向锁)
- [示例 2:表锁检测冲突](#示例 2:表锁检测冲突)
- 五、意向锁的特点总结
- 六、一句话总结
在 MySQL(主要是 InnoDB 存储引擎) 中,意向锁(Intention Lock) 是一种 表级锁 ,用来表示事务打算在表中的某些行上加什么类型的行锁 ,从而提高锁冲突判断的效率。
一、为什么需要意向锁?
InnoDB 同时支持:
- 表锁
- 行锁
如果没有意向锁,当一个事务想给整张表加锁时,就必须 逐行检查是否有行锁存在,这在大表中会非常低效。
👉 意向锁的作用 :
让数据库 只需检查表级的意向锁,就能快速判断是否可以加表锁,而不必扫描整张表的行锁。
二、意向锁的类型
InnoDB 有 两种意向锁:
| 意向锁类型 | 含义 |
|---|---|
| IS(Intention Shared Lock) | 表示事务打算在表中某些行上加 共享锁(S) |
| IX(Intention Exclusive Lock) | 表示事务打算在表中某些行上加 排他锁(X) |
三、意向锁的工作机制
1️⃣ 加行锁前,先加意向锁(表级)
-
加行级共享锁(S)前
→ 先在表上加 IS 锁
-
加行级排他锁(X)前
→ 先在表上加 IX 锁
⚠️ 意向锁 不是用户显式加的 ,而是 InnoDB 自动维护的
2️⃣ 锁兼容关系(重点)
| IS | IX | S | X | |
|---|---|---|---|---|
| IS | ✔ | ✔ | ✔ | ✘ |
| IX | ✔ | ✔ | ✘ | ✘ |
| S | ✔ | ✘ | ✔ | ✘ |
| X | ✘ | ✘ | ✘ | ✘ |
📌 关键理解:
- 多个事务可以同时持有 IS / IX
- 表级 S / X 锁会与意向锁发生冲突
- 意向锁之间几乎不冲突
四、举例说明(非常重要)
示例 1:行锁 + 意向锁
sql
START TRANSACTION;
SELECT * FROM user WHERE id = 1 FOR UPDATE;
发生的事情:
- 在
user表上加 IX(意向排他锁) - 在
id = 1这行上加 X(排他锁)
示例 2:表锁检测冲突
sql
LOCK TABLE user WRITE;
MySQL 只需检查:
user表上是否存在 IS / IX
如果存在 IX ,说明有事务在改某些行
➡️ WRITE 表锁不能加,直接阻塞或失败
五、意向锁的特点总结
✅ 意向锁是 表级锁
✅ 由 InnoDB 自动加锁与释放
✅ 不会阻塞 行锁之间的并发
✅ 用于 快速判断表锁与行锁是否冲突
✅ 是 多粒度锁(Multi-Granularity Locking) 的核心机制
六、一句话总结
意向锁是 InnoDB 的一种表级锁,用来表明事务将要在表的某些行上加行锁,从而避免在加表锁时逐行检查行锁,提高锁冲突检测的效率。
推荐阅读《MySQL 数据库 意向锁 详解(白话篇:一看就懂)》
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/156236633