MySQL

MySQL 事务与锁

·6 分钟阅读·2029 字

整理 MySQL 事务 ACID、隔离级别、MVCC、行锁、间隙锁、临键锁和死锁相关面试题

📋 目录

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 实现一致性非锁定读。

核心组成:

  1. trx_id:记录最近一次修改该行的事务 ID。
  2. roll_pointer:指向 undo log 中的历史版本。
  3. undo log:保存行的历史版本。
  4. 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 部分,分析:

  1. 两个事务分别执行了什么 SQL。
  2. 各自持有什么锁。
  3. 正在等待什么锁。
  4. 是否存在访问顺序不一致、索引缺失或大事务。

优化方向:

  • 固定业务访问顺序。
  • 缩短事务时间。
  • 使用合适索引减少锁范围。
  • 避免事务中混入慢操作和外部调用。

7. 面试总结

标准回答 MySQL 事务通过 undo、redo、锁和 MVCC 共同实现 ACID。undo 支持回滚和历史版本,redo 保证崩溃恢复,MVCC 通过隐藏字段、undo 版本链和 Read View 实现快照读,锁机制保证当前读和写操作的并发安全。InnoDB 行锁基于索引实现,RR 隔离级别下会使用间隙锁和临键锁减少幻读。排查锁等待和死锁时,重点查看 SHOW ENGINE INNODB STATUS\G、事务持锁信息、SQL 访问路径和索引命中情况。


关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro