322 字
2 分钟
MySQL InnoDB 锁的分类:行锁、表锁与意向锁
InnoDB 的锁可以从两个维度分类:按粒度分为表锁和行锁,按模式分为共享锁(S)与排他锁(X)。
共享锁与排他锁
S 锁允许多个事务同时持有;X 锁独占,和其他 S/X 锁都冲突。SELECT ... LOCK IN SHARE MODE 获取共享锁,SELECT ... FOR UPDATE 获取排他锁。
元数据锁
MDL 保护表结构。读取表元数据时获取共享 MDL,执行 ALTER TABLE 等 DDL 时获取排他 MDL;排他 MDL 会阻塞其他读写元数据操作。
表结构 → DDL → MDL 写锁表数据 → DML → MDL 读锁意向锁
加表锁前如果逐行检查是否存在行锁,成本很高。因此 InnoDB 在给行加 S 锁或 X 锁前,先在表上分别加 IS 或 IX,表锁只需检查意向锁即可知道表内是否存在对应行锁。
三种典型行锁
- 记录锁:锁住具体索引记录。
- 间隙锁:锁住两条记录之间的空隙,阻止插入。
- 临键锁:记录锁加间隙锁,锁定一个左开右闭区间。
没有合适索引时,范围扫描可能锁住大量记录;因此索引设计不仅影响查询速度,也影响锁粒度和并发能力。
MySQL InnoDB 锁的分类:行锁、表锁与意向锁
https://blog.xqcherry.top/posts/interview/mysql/lock-types/ 目录