MySQL 事务底层实现¶
一、ACID 怎么实现¶
| 特性 | 实现 |
|---|---|
| 原子性 | undo log |
| 持久性 | redo log |
| 隔离性 | lock + MVCC |
| 一致性 | 上面三者共同保证 |
二、redo log(持久性)¶
- WAL(Write-Ahead Logging):先写日志,再写磁盘。
- 修改时先写 redo log,Buffer Pool 异步刷盘。
- Crash 后用 redo log 恢复。
三、undo log(原子性)¶
- 记录修改前的版本。
- 回滚时用 undo log。
- MVCC 也用 undo log 实现。
四、锁(隔离性)¶
- 读锁(共享)。
- 写锁(排他)。
- 不同隔离级别锁不同。
五、两阶段锁¶
- 执行阶段加锁。
- commit 时统一释放。
六、binlog¶
Server 层日志,用于主从复制。
redo log vs binlog¶
| redo log | binlog | |
|---|---|---|
| 层 | InnoDB | Server |
| 内容 | 物理页 | 逻辑 SQL |
| 用途 | 恢复 | 复制 |
| 写入 | 循环写 | 追加写 |
两阶段提交保证 redo log 和 binlog 一致。
一句话
redo log 保持久,undo log 保原子,锁 + MVCC 保隔离。