直接回答

InnoDB 用一组机制分别实现 ACID:原子性靠 undo log(记录修改前的旧值,回滚时逆向恢复);持久性靠 redo log(WAL,先写日志再刷数据页,崩溃后重放);隔离性靠锁 + MVCC(多版本并发控制);一致性是前三者共同保障的最终目标,再加约束(唯一键、外键)兜底。

展开解析

  • undo log:每次修改把旧版本写入 undo,回滚时按记录反向操作;同时 undo 链也是 MVCC 的版本来源。
  • redo log:事务修改先记 redo(物理日志,顺序写,比随机刷数据页快),commit 时保证 redo 落盘即可返回,数据页由后台线程异步刷。崩溃恢复时重放 redo 恢复已提交事务。innodb_flush_log_at_trx_commit 控制刷盘时机,=1 最安全。
  • MVCC:每行有隐藏的事务 ID 和回滚指针,配合 ReadView(读视图)判断哪个版本对当前事务可见。读已提交(RC)每次快照读生成新 ReadView,可重复读(RR,默认)事务内复用第一个 ReadView,从而实现一致性非锁定读。
  • :写操作加行锁(Record Lock)、RR 下用间隙锁/Next-Key Lock 防幻读;快照读则完全不阻塞写。

追问方向:为什么 RR 下仍有部分幻读场景(当前读)、两阶段提交如何保证 redo 与 binlog 一致。