主题
面试速答(先看这里)
**一句话结论:**原子性意味着事务的所有操作要么全部提交成功,要么全部失败回滚。
60秒标准回答:
所谓ACID,其实是原子性、一致性、隔离性、持久性,那么,MySQL的事务是如何实现原子性、一致性、隔离性和持久性的呢?
原子性意味着事务的所有操作要么全部提交成功,要么全部失败回滚。MySQL的原子性是通过undolog实现的
Undo Log则用于在事务回滚或系统崩溃时撤销(回滚)事务所做的修改。 当一个事务执行过程中,MySQL会将事务 修改前 的数据记录到Undo Log中。如果事务需要回滚,则会从Undo Log中找到相应的记录来撤销事务所做的修改
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**所谓ACID,其实是原子性、一致性、隔离性、持久性,那么,MySQL的事务是如何实现原子性、一致性、隔离性和持久性的呢?
- **要点2:**隔离性指的是多个并发事务执行时,彼此互不干扰。
- **要点3:**这个我认为主要是依赖MySQL的持久化机制,它是基于磁盘存储的,并且还有Redo Log可以用来崩溃恢复。
- **要点4:**Redo Log是MySQL用于实现崩溃恢复和数据持久性的一种机制。
- **要点5:**MySQL中还有很多主键、外键、唯一性约束、非空约束等等都能帮我们保证数据的一致性的逻辑。
**记忆锚点:**MySQL → Log → Redo → Undo → MVCC → ReadView
易错提醒:
- 原子性意味着事务的所有操作要么全部提交成功,要么全部失败回滚。
加分表达:
- 如果事务需要回滚,则会从Undo Log中找到相应的记录来撤销事务所做的修改。
- 还有就是其实一致性最重视靠底层 ACID 机制共同保障的,如果原子性、隔离性、持久性做到了,那一致性也就满足了。
追问准备:
- 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Log」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Redo」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
所谓ACID,其实是原子性、一致性、隔离性、持久性,那么,MySQL的事务是如何实现原子性、一致性、隔离性和持久性的呢?
原子性
原子性意味着事务的所有操作要么全部提交成功,要么全部失败回滚。MySQL的原子性是通过undolog实现的。
**Undo Log则用于在事务回滚或系统崩溃时撤销(回滚)事务所做的修改。**当一个事务执行过程中,MySQL会将事务修改前的数据记录到Undo Log中。如果事务需要回滚,则会从Undo Log中找到相应的记录来撤销事务所做的修改。
打开文档:✅binlog、redolog和undolog区别?
隔离性
隔离性指的是多个并发事务执行时,彼此互不干扰。MySQL的隔离性主要靠MVCC和锁机制来保证的。
我们都知道,MySQL中是有不同的隔离级别的,比如RC、RR等,这些的背后其实都是MVCC和锁在起作用。
在下面这篇中,我们介绍过,不同的隔离级别是分别如何实现的。
| 隔离级别 | 实现方式 |
|---|---|
| 读未提交 | 直接读取最新数据,无锁和 MVCC 控制。 |
| 读已提交 | 每次查询生成新 ReadView,读取已提交的最新版本。 |
| 可重复读 | 事务开始时生成 ReadView,后续所有读操作基于此视图。 |
| 串行化 | 强制加锁,所有操作串行执行。 |
持久性
持久性指的是事务提交后,修改永久保存,即使系统崩溃也不丢失。
这个我认为主要是依赖MySQL的持久化机制,它是基于磁盘存储的,并且还有Redo Log可以用来崩溃恢复。
**Redo Log是MySQL用于实现崩溃恢复和数据持久性的一种机制。**在事务进行过程中,MySQL会将事务做了什么改动到Redo Log中。当系统崩溃或者发生异常情况时,MySQL会利用Redo Log中的记录信息来进行恢复操作,将事务所做的修改持久化到磁盘中。
一致性
一致性,要求事务执行后,数据库从一个一致状态转换到另一个一致状态。
MySQL中还有很多主键、外键、唯一性约束、非空约束等等都能帮我们保证数据的一致性的逻辑。还有就是其实一致性最重视靠底层 ACID 机制共同保障的,如果原子性、隔离性、持久性做到了,那一致性也就满足了。
总结
| 特性 | 实现机制 |
|---|---|
| 原子性 | Undo Log |
| 隔离性 | 锁机制(共享锁、排他锁、间隙锁) + MVCC(版本链、ReadView) |
| 持久性 | Redo Log(崩溃恢复) |
| 一致性 | 原子性、隔离性、持久性共同保障 + 数据库约束 |