MySQL 事务与锁面试题
1. ACID 事务特性
【题目】
简述 MySQL 中的事务及其 ACID 特性?
【参考答案】
事务是数据库操作的基本单位,要么全部执行成功,要么全部不执行。
| 特性 | 含义 | 🔧 实现机制 |
|---|---|---|
| Atomicity(原子性) | 事务不可分割,全有或全无 | undo log 回滚 |
| Consistency(一致性) | 数据完整性约束不被破坏 | 应用层 + 数据库约束共同保证 |
| Isolation(隔离性) | 并发事务互不干扰 | MVCC + 锁机制 |
| Durability(持久性) | 提交后永久保存 | redo log + 磁盘写入 |
面试踩分点 不仅要能说出四个特性,还要说出各特性的底层实现机制(undo log、MVCC、redo log),这是区分”背概念”和”真理解”的关键。
【延伸追问】
- 四种隔离级别分别解决了哪些问题?
- MVCC 是如何实现 RC 和 RR 隔离级别的?
【易错坑点】
- ❌ 原子性 ≠ 隔离性:原子性靠 undo log,隔离性靠 MVCC/锁
- ❌ 持久性不是绝对的,取决于 innodb_flush_log_at_trx_commit 配置
2. 脏读、不可重复读、幻读
【题目】
什么是脏读、不可重复读、幻读?
【参考答案】
| 问题 | 现象 | 对比记忆 |
|---|---|---|
| 脏读(Dirty Read) | 读到其他事务未提交的数据,对方回滚后数据”不存在” | 📌 读到了”不存在”的数据 |
| 不可重复读(Non-repeatable Read) | 同一事务两次读取同一条记录,返回不同值 | 📌 行数据变化 |
| 幻读(Phantom Read) | 同一事务两次范围查询,结果集行数不同 | 📌 结果集行数变化 |
隔离级别对照:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ❌ 未解决 | ❌ 未解决 | ❌ 未解决 |
| READ COMMITTED | ✅ 解决 | ❌ 未解决 | ❌ 未解决 |
| REPEATABLE READ(⚠️ MySQL 默认) | ✅ 解决 | ✅ 解决 | ✅ 解决(InnoDB Gap Lock) |
| SERIALIZABLE | ✅ 解决 | ✅ 解决 | ✅ 解决 |
MySQL RR 的特殊性 大多数数据库(如 Oracle)的 RR 不解决幻读,但 MySQL InnoDB 通过 Gap Lock(间隙锁)解决了 RR 下的幻读。这是面试高频加分点。
【延伸追问】
- MySQL InnoDB 的 RR 级别是如何解决幻读的?(MVCC + Gap Lock = Next-Key Lock)
- 什么是 Next-Key Lock?
【易错坑点】
- ❌ 不可重复读 ≠ 幻读:前者是行数据变化,后者是行数变化
- ❌ MySQL 的 RR 能解决幻读,但大多数数据库的 RR 不能,面试时注意区分
关联文档
- MySQL 基础知识面试题 — 基础概念题
- MySQL 日志与复制 — 日志与主从复制