✅ 一、按粒度分类(锁的范围大小)
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 专属锁机制,面试考频高。