3. 事务与隔离级别¶
事务是数据库区别于文件系统的重要特性。
3.1 ACID 的实现原理¶
面试官常问:“MySQL 是如何保证 ACID 的?”
- 原子性 (Atomicity):由 Undo Log 保证。如果事务执行失败或回滚,利用 Undo Log 将数据恢复到事务开始前的状态。
- 一致性 (Consistency):这是最终目标。由原子性、隔离性、持久性共同保证,以及业务层的约束(如外键)。
- 隔离性 (Isolation):由 MVCC(多版本并发控制)和 锁机制 保证。
- 持久性 (Durability):由 Redo Log 保证。事务提交时,先写 Redo Log,再异步刷新到磁盘数据页(WAL 技术)。即使宕机,也能通过 Redo Log 恢复。
3.2 并发事务带来的问题¶
- 脏读 (Dirty Read):读到了其他事务未提交的数据。
- 不可重复读 (Non-Repeatable Read):同一个事务中,两次读取同一行数据,结果不一样(被其他事务 update/delete 了)。
- 幻读 (Phantom Read):同一个事务中,两次查询同一个范围,结果集行数不一样(被其他事务 insert 了)。
3.3 四种隔离级别详解¶
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现机制 |
|---|---|---|---|---|
| 读未提交 (RU) | √ | √ | √ | 不加锁,直接读最新数据 |
| 读已提交 (RC) | × | √ | √ | MVCC (每次 Select 生成新 ReadView) |
| 可重复读 (RR) | × | × | × (大部分) | MVCC (第一次 Select 生成 ReadView) + Next-Key Lock |
| 串行化 (Serializable) | × | × | × | 强制加锁,读写串行 |
注意:MySQL 的默认隔离级别是 RR (Repeatable Read),而 Oracle 的默认级别是 RC (Read Committed)。