锁机制专题
锁是 MySQL 并发控制的核心机制,理解各种锁的类型、粒度和使用场景是面试的必考内容。
常见题型
| 题型 | 核心知识点 | 典型问题 |
|---|
| 锁类型 | 共享锁、排他锁、意向锁 | S 锁 vs X 锁、意向锁的作用 |
| 锁粒度 | 表锁、行锁、页锁 | InnoDB 为什么用行锁 |
| 间隙锁 | Gap Lock、Next-Key Lock | 间隙锁的作用、范围查询加锁 |
| 死锁 | 死锁产生、检测、避免 | 如何避免死锁、死锁日志分析 |
| 锁升级 | 行锁升级表锁 | InnoDB 会有锁升级吗 |
锁类型对比
| 锁类型 | 符号 | 作用范围 | 兼容性 | 用途 |
|---|
| 共享锁(S) | LOCK_S | 行/表 | S↔S | 读操作 |
| 排他锁(X) | LOCK_X | 行/表 | X↔无 | 写操作 |
| 意向共享锁(IS) | LOCK_IS | 表 | IS↔IS, IS↔IX | 表级意向锁 |
| 意向排他锁(IX) | LOCK_IX | 表 | IX↔IX | 表级意向锁 |
| 间隙锁(Gap) | LOCK_GAP | 范围 | Gap↔Gap | 防止幻读 |
| 临键锁(Next-Key) | LOCK_ORDINARY | 范围+记录 | Gap↔Gap | 防止幻读 |
锁粒度对比
| 粒度 | 并发度 | 开销 | 引擎 |
|---|
| 表锁 | 低 | 小 | MyISAM |
| 行锁 | 高 | 大 | InnoDB |
| 页锁 | 中 | 中 | BDB |
死锁场景
| 场景 | 示例 |
|---|
| 不同顺序加锁 | A: 1→2, B: 2→1 |
| 索引丢失 | 更新时索引失效,升级为表锁 |
| 外键关联 | 子表加锁,父表加锁 |
| 自增锁 | INSERT 并发插入 |
死锁处理
| 方法 | 说明 |
|---|
| 超时等待 | innodb_lock_wait_timeout |
| 死锁检测 | innodb_deadlock_detect |
| 回滚事务 | 回滚代价小的事务 |