60 秒回答模板

事务是一组需要作为整体提交或回滚的数据库操作。ACID 中,原子性保证要么全成要么全败,通常依赖 undo log;一致性保证事务前后满足约束和业务不变量;隔离性控制并发事务之间的可见性,依赖锁、MVCC、Read View 等机制;持久性保证 commit 后崩溃也能恢复,依赖 redo log 和刷盘策略。在 MySQL 里还要能解释快照读、当前读、隔离级别、长事务和 redo/binlog 两阶段提交。

考点 核心机制与工程取舍
难度 中高频面试题
回答目标 按定义、机制、场景讲清楚

深入解析

01

事务边界对应业务原子单元

以转账为例,扣 A 账户和加 B 账户必须在同一个事务里。任一步失败都 rollback,不能出现只扣款不入账。事务边界过小保不住不变量,过大会增加锁和日志成本。

02

ACID 要讲语义和机制

原子性靠 undo log 回滚已执行修改;持久性靠 redo log 恢复已提交修改;隔离性靠锁和 MVCC 控制并发;一致性不是单独一个日志实现,而是约束、事务代码和隔离共同维护业务正确性。

03

隔离级别解决不同异常

读未提交可能脏读,读已提交避免脏读但可能不可重复读,可重复读通过 Read View 让同一事务看到稳定快照,串行化最强但并发最低。当前读还会加锁,和普通快照读不同。

04

MySQL 里要区分快照读和当前读

普通 `select` 多为快照读,通过版本链和 Read View 读取历史版本;`select for update`、`update`、`delete` 是当前读,需要读最新记录并加锁。幻读讨论通常要结合 next-key lock。

05

提交和恢复要考虑崩溃点

InnoDB 先写 redo 再落数据页,崩溃后可重放已提交修改。涉及 binlog 时需要两阶段提交,避免 redo 和 binlog 一边成功一边失败导致主从或恢复不一致。

易错点

  • 只背 ACID 四个词,不讲 undo、redo、锁和 MVCC。
  • 把数据库事务当成分布式业务一致性的万能解。
  • 混淆一致性和隔离性,把并发可见性问题全归为一致性。
  • 忽略长事务、自动提交、DDL 隐式提交等工程边界。

面试官追问

一致性是不是数据库自动保证?

不是。数据库提供约束、事务、锁和日志能力,业务仍要正确设计状态流转,例如余额不能为负、订单状态不能逆流。

undo log 和 redo log 有什么区别?

undo 记录修改前信息,用于回滚和 MVCC;redo 记录物理页修改,用于崩溃恢复已提交结果。

长事务有什么问题?

长事务会长时间持锁,保留大量历史版本,拖慢 purge,增加 undo 空间,还可能让备份和复制延迟变差。

可重复读一定完全没有幻读吗?

普通快照读能看到稳定快照;当前读需要 next-key lock 等锁机制防止范围内插入。回答时要区分快照读和当前读。