事务是一组操作的集合这组操作要么全部成功要么全部失败。数据库把它们作为一个不可分割的工作单位来提交或回滚。最经典的例子是转账A 扣 100 元B 加 100 元。这两步必须一起成功否则数据就会出错。事务最基本的执行分叉其实就两条路是否开启事务执行多条 SQL所有操作是否成功commit 提交rollback 回滚修改永久生效恢复到事务开始前ACID 是什么特性含义转账例子原子性 Atomicity事务不可分割要么全成功要么全失败A 扣钱和 B 加钱必须一起完成一致性 Consistency事务前后数据满足约束和业务规则总金额不能凭空增加或减少隔离性 Isolation并发事务之间互不干扰到不合理程度别的事务不能读到错误中间态持久性 Durability提交后的修改永久生效提交后即使宕机也能恢复ACID 不是四个孤立概念。InnoDB 通过锁、MVCC、redo log、undo log、Buffer Pool 等机制共同实现它们。并发事务会带来哪些问题脏读一个事务读到了另一个事务还没提交的数据。如果对方回滚了前面读到的就是无效数据。不可重复读同一个事务内两次读取同一行数据结果不一样。原因通常是另一个事务在中间提交了更新。幻读一个事务按条件查询时没有某行数据但插入时发现这行已经存在像是出现了“幻影”。它关注的是符合条件的记录集合发生变化。四种隔离级别隔离级别越高数据越安全但并发性能通常越低。隔离级别脏读不可重复读幻读说明READ UNCOMMITTED可能可能可能几乎不做隔离READ COMMITTED避免可能可能每次读只能读已提交数据REPEATABLE READ避免避免通常可处理MySQL InnoDB 默认常用级别SERIALIZABLE避免避免避免串行化性能最低隔离级别解决的是并发读写之间的可见性和冲突问题。后面理解 MVCC 时READ COMMITTED和REPEATABLE READ的差异尤其重要。Buffer Pool 与数据页InnoDB 不会每次都直接读写磁盘。它会把经常访问的数据页缓存在内存中的 Buffer Pool。数据页是 InnoDB 管理磁盘的最小单位默认大小为 16KB。执行增删改查时通常先操作 Buffer Pool 中的数据页如果页不在内存再从磁盘加载。这样做可以减少磁盘 IO但也带来一个问题如果数据只改在内存里还没刷到磁盘就宕机怎么办答案就是 redo log。redo log保证持久性redo log 记录的是数据页的物理修改。事务提交时InnoDB 会先把修改写入 redo log再慢慢把脏页刷回磁盘。这就是 WAL也就是 Write-Ahead Logging先写日志再写数据页。提交时可以抓住 WAL 这条主线是否事务修改数据页生成 undo log 旧值修改 Buffer Pool 中的数据页写入 redo logredo log 是否安全落盘事务可以提交成功提交不能算真正完成脏页后续异步刷回磁盘宕机后可用 redo log 恢复redo log 由两部分组成部分位置作用redo log buffer内存暂存日志redo log file磁盘宕机恢复时使用如果事务提交后服务宕机但脏页还没刷盘重启后可以根据 redo log 重新应用修改恢复已提交事务的数据。undo log支持回滚和 MVCCundo log 记录的是数据被修改前的信息它是逻辑日志。可以这样理解操作undo log 中记录什么insert记录一条反向delete所需信息delete记录一条反向insert所需信息update记录恢复旧值所需信息当事务回滚时InnoDB 可以根据 undo log 做反向操作把数据恢复到修改前的状态。undo log 还有另一个重要作用为 MVCC 提供旧版本数据。update和delete产生的 undo log提交后不一定立刻删除因为可能还有事务需要读取旧版本。redo log 和 undo log 的区别对比项redo logundo log记录内容数据页的物理变化修改前的逻辑信息核心作用宕机恢复事务回滚、MVCC支撑特性持久性原子性、一致性、隔离性的一部分写入时机事务提交前后参与刷盘策略数据修改前记录旧值一句话总结redo log 保证提交后的数据能恢复undo log 保证失败时能撤回也能让快照读看到旧版本。面试回答模板可以这样回答事务是一组不可分割的操作具备 ACID 特性。原子性表示要么全成功要么全失败一致性表示事务前后数据满足规则隔离性解决并发事务互相影响的问题持久性表示提交后数据永久生效。并发事务可能出现脏读、不可重复读、幻读可以通过不同隔离级别控制。InnoDB 底层通过 undo log 支持回滚和旧版本读取通过 redo log 保证事务提交后的持久性通过锁和 MVCC 共同保证隔离性。小结事务不是只靠一个机制实现的。undo log 让事务可以回滚redo log 让提交结果可以恢复隔离级别定义了并发读写的可见性边界。把这几部分串起来ACID 就不再是死记硬背的四个词。