MySQL 事务与锁
核心定位 本文整理 MySQL 事务与锁机制的高频面试题,重点覆盖 ACID、隔离级别、MVCC、当前读、快照读、行锁、间隙锁、临键锁和死锁排查。
1. 事务 ACID 是什么
1.1. 题目
MySQL 事务的 ACID 分别指什么?
1.2. 参考答案
| 特性 | 含义 | MySQL 相关机制 |
|---|---|---|
| Atomicity 原子性 | 事务内操作要么全部成功,要么全部失败 | undo log |
| Consistency 一致性 | 事务前后数据满足约束和业务规则 | 约束、事务、日志 |
| Isolation 隔离性 | 并发事务之间互不干扰或按规则可见 | 锁、MVCC、隔离级别 |
| Durability 持久性 | 提交后的数据不会因宕机丢失 | redo log、刷盘策略 |
简化记忆:undo 保证回滚,redo 保证崩溃恢复,锁和 MVCC 保证隔离。
2. 四种隔离级别
2.1. 题目
MySQL 支持哪些隔离级别?分别解决什么问题?
2.2. 参考答案
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 | 可读未提交数据 |
| Read Committed | 避免 | 可能 | 可能 | 每次语句生成新 Read View |
| Repeatable Read | 避免 | 避免 | 通常可避免 | MySQL InnoDB 默认级别 |
| Serializable | 避免 | 避免 | 避免 | 串行执行,性能低 |
InnoDB 默认使用 RR,可通过 MVCC 和临键锁在常见场景下避免幻读。
3. MVCC 原理
3.1. 题目
MySQL MVCC 是怎么实现的?
3.2. 参考答案
MVCC 通过隐藏字段、undo log 版本链和 Read View 实现一致性非锁定读。
核心组成:
trx_id:记录最近一次修改该行的事务 ID。roll_pointer:指向 undo log 中的历史版本。- undo log:保存行的历史版本。
- Read View:判断当前事务能看到哪些版本。
快照读会根据 Read View 沿 undo 版本链查找可见版本,从而避免普通查询阻塞写入。
4. 快照读与当前读
4.1. 题目
快照读和当前读有什么区别?
4.2. 参考答案
| 类型 | 语句示例 | 是否加锁 | 读取内容 |
|---|---|---|---|
| 快照读 | SELECT * FROM t WHERE id=1 | 通常不加锁 | Read View 可见版本 |
| 当前读 | SELECT ... FOR UPDATE、UPDATE、DELETE | 加锁 | 最新已提交版本 |
当前读需要保证读到最新数据并加锁,因此会参与行锁、间隙锁和临键锁控制。
5. 行锁、间隙锁、临键锁
5.1. 题目
InnoDB 行锁、间隙锁、临键锁分别是什么?
5.2. 参考答案
| 锁类型 | 锁定范围 | 作用 |
|---|---|---|
| 记录锁 Record Lock | 已存在的索引记录 | 防止当前行被修改 |
| 间隙锁 Gap Lock | 两个索引记录之间的间隙 | 防止间隙内插入新记录 |
| 临键锁 Next-Key Lock | 记录锁 + 前方间隙锁 | 防止范围查询幻读 |
InnoDB 的行锁是加在索引上的。查询条件没有命中索引时,可能扫描更多记录并扩大锁范围。
6. 死锁产生与排查
6.1. 题目
MySQL 死锁如何产生?如何排查?
6.2. 参考答案
死锁通常由多个事务以不同顺序持有和等待锁导致。
排查命令:
SHOW ENGINE INNODB STATUS\G
关注 LATEST DETECTED DEADLOCK 部分,分析:
- 两个事务分别执行了什么 SQL。
- 各自持有什么锁。
- 正在等待什么锁。
- 是否存在访问顺序不一致、索引缺失或大事务。
优化方向:
- 固定业务访问顺序。
- 缩短事务时间。
- 使用合适索引减少锁范围。
- 避免事务中混入慢操作和外部调用。
7. 面试总结
标准回答 MySQL 事务通过 undo、redo、锁和 MVCC 共同实现 ACID。undo 支持回滚和历史版本,redo 保证崩溃恢复,MVCC 通过隐藏字段、undo 版本链和 Read View 实现快照读,锁机制保证当前读和写操作的并发安全。InnoDB 行锁基于索引实现,RR 隔离级别下会使用间隙锁和临键锁减少幻读。排查锁等待和死锁时,重点查看
SHOW ENGINE INNODB STATUS\G、事务持锁信息、SQL 访问路径和索引命中情况。
关联文档
- MySQL 高阶运维知识点完整总结:系统理解 InnoDB、MVCC 和锁机制。
- MySQL 基础知识面试题:补充 MySQL 基础面试问题。
- MySQL 运维场景题:结合生产故障场景理解锁等待和死锁。
