事务机制专题
事务是 MySQL 数据库的核心特性,理解事务的 ACID 特性、隔离级别和 MVCC 实现是面试的必考内容。
常见题型
| 题型 | 核心知识点 | 典型问题 |
|---|
| ACID | 原子性、一致性、隔离性、持久性 | 解释 ACID、如何实现 |
| 隔离级别 | 读未提交、读已提交、可重复读、串行化 | 四种隔离级别、解决什么问题 |
| 并发问题 | 脏读、不可重复读、幻读 | 各种问题的定义和解决方案 |
| MVCC | 多版本并发控制 | MVCC 实现原理、Read View |
| 锁机制 | 共享锁、排他锁、间隙锁 | 各种锁的使用场景 |
| Redo/Undo Log | 持久性、原子性 | Redo 和 Undo 的作用 |
事务隔离级别对比
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | MySQL 默认 |
|---|
| 读未提交(READ UNCOMMITTED) | ✓ | ✓ | ✓ | - |
| 读已提交(READ COMMITTED) | ✗ | ✓ | ✓ | - |
| 可重复读(REPEATABLE READ) | ✗ | ✗ | ✓ (部分) | ✓ |
| 串行化(SERIALIZABLE) | ✗ | ✗ | ✗ | - |
并发问题详解
| 问题 | 定义 | 示例 |
|---|
| 脏读 | 读取未提交的数据 | A 修改未提交,B 读到 |
| 不可重复读 | 同一事务两次读取结果不同 | A 读取后,B 修改并提交,A 再读 |
| 幻读 | 范围查询出现新数据 | A 查询范围,B 插入新行,A 再查 |
MVCC 关键组件
| 组件 | 作用 |
|---|
| 隐藏字段 | DB_TRX_ID、DB_ROLL_PTR |
| Undo Log | 回滚日志,存储旧版本 |
| Read View | 读视图,判断可见性 |
| Purge 机制 | 清理过期 Undo Log |
锁类型对比
| 锁类型 | 分类 | 作用范围 | 兼容性 |
|---|
| 共享锁(S) | 行锁 | 单行 | ✓ 与 S |
| 排他锁(X) | 行锁 | 单行 | ✗ 与 S/X |
| 间隙锁 | Gap 锁 | 范围 | ✓ 与 Gap |
| 临键锁 | Next-Key | 范围+记录 | ✓ 与 Gap |