事务与 ACID
mediumMySQL事务ACIDredo logundo log
什么是事务
事务是一组操作的逻辑单元,要么全部成功,要么全部回滚。经典例子:银行转账——A 扣款和 B 入账必须同时成功或同时失败。
ACID 特性及实现
| 特性 | 含义 | InnoDB 实现方式 |
|---|---|---|
| 原子性 (Atomicity) | 事务中的操作要么全做,要么全不做 | undo log(回滚日志) |
| 一致性 (Consistency) | 事务前后数据库从一个一致状态到另一个 | 其他三个特性共同保证 |
| 隔离性 (Isolation) | 并发事务之间互不干扰 | MVCC + 锁 |
| 持久性 (Durability) | 事务提交后数据永久保存 | redo log(重做日志) |
redo log 保证持久性
InnoDB 采用 WAL(Write-Ahead Logging) 策略:事务提交时先写 redo log(顺序写入,速度快),再在后台异步将脏页刷盘。即使数据库崩溃,重启后也可通过 redo log 恢复已提交的事务。
事务提交过程:
1. 将修改记录写入 redo log buffer
2. redo log buffer 刷盘(fsync)→ 持久化完成
3. 返回"提交成功"
4. 后台线程异步将内存中的脏页刷到磁盘数据文件
崩溃恢复:
重启 → 检查 redo log → 将已提交但未刷盘的修改重做 → 数据恢复
undo log 保证原子性
undo log 记录修改前的数据。如果事务需要回滚,就用 undo log 将数据恢复到修改前的状态。undo log 同时也是 MVCC 实现的基础。
生产高频题
ACID 各用什么机制保证?
原子性 → undo log(回滚);持久性 → redo log(WAL 崩溃恢复);隔离性 → MVCC + 锁;一致性 → 是其他三个特性的综合结果。
redo log 和 undo log 的区别?
redo log 是物理日志(记录哪个数据页做了什么修改),用于崩溃恢复保证持久性。undo log 是逻辑日志(记录修改前的值),用于事务回滚保证原子性,也用于 MVCC 实现隔离性。