【计算机基础速成】第四课:事务、ACID 与隔离级别
1. 这节课的目标
事务是数据库面试中的另一块核心高频区。
面试官经常会问:
- 什么是事务?
- 事务的 ACID 是什么?
- 什么是脏读、不可重复读、幻读?
- 数据库隔离级别有哪些?
- MySQL 默认隔离级别是什么?
- 隔离级别越高越好吗?
这节课学完后,你至少要做到:
- 能说清事务是什么
- 能背出 ACID
- 能分清脏读、不可重复读、幻读
- 能说出四种隔离级别及其解决的问题
- 能回答 MySQL 默认隔离级别
2. 什么是事务
一句话理解
事务就是一组操作,要么都成功,要么都失败。
生活化例子
比如转账:
- A 账户扣 100 元
- B 账户加 100 元
这两个动作必须一起成功。
如果 A 扣了钱,但 B 没收到钱,就出问题了。
所以这两个操作必须放进一个事务里,保证:
- 要么都执行成功
- 要么都不生效
3. 面试怎么回答“什么是事务”
标准回答
事务是数据库中一组逻辑上的操作单元,这组操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和正确性。
关键词
- 一组操作
- 逻辑单元
- 要么都成功
- 要么都回滚
- 保证数据一致性
4. 为什么需要事务
如果没有事务,在多步操作中只要中间某一步失败,就可能造成数据不一致。
例子
还是转账场景:
- 第一步:A 扣钱成功
- 第二步:B 加钱失败
这时数据库状态就错了。
事务的价值就是:
保证多步操作在逻辑上是一个整体。
5. ACID 是什么
这是事务最经典的面试题。
ACID 是事务的四个特性:
- Atomicity:原子性
- Consistency:一致性
- Isolation:隔离性
- Durability:持久性
5.1 原子性 Atomicity
一句话理解
事务中的操作不可再分,要么全做,要么全不做。
面试答法
原子性指的是事务中的所有操作要么全部成功,要么全部失败,不会只执行一部分。
5.2 一致性 Consistency
一句话理解
事务执行前后,数据要保持合法、正确的状态。
面试答法
一致性指的是事务执行前后,数据库都必须从一个一致状态转换到另一个一致状态,不能破坏数据的业务规则和约束。
怎么理解
比如转账前后,总金额应该保持不变,这就是一致性。
5.3 隔离性 Isolation
一句话理解
多个事务并发执行时,彼此之间不要互相干扰。
面试答法
隔离性指的是多个事务并发执行时,一个事务的中间状态对其他事务应该尽量不可见,从而避免并发带来的数据问题。
5.4 持久性 Durability
一句话理解
事务一旦提交,结果就应该被永久保存下来。
面试答法
持久性指的是事务一旦提交,对数据的修改就应该被永久保存,即使系统发生故障,提交结果也不应丢失。
6. ACID 面试标准答法
如果面试官问:
事务的 ACID 是什么?
你可以这样答:
事务有四个基本特性,也就是 ACID。
A 是原子性,表示事务中的操作要么全部成功,要么全部失败;
C 是一致性,表示事务执行前后数据库都要保持一致状态;
I 是隔离性,表示并发事务之间要尽量互不干扰;
D 是持久性,表示事务一旦提交,结果就会被永久保存。这段你建议直接背。
7. 并发事务会带来什么问题
数据库里经常会有多个事务同时执行,这时候如果隔离做得不够好,就会出现并发问题。
最经典的三种并发问题是:
- 脏读
- 不可重复读
- 幻读
8. 脏读
一句话理解
读到了别的事务还没提交的数据。
场景
事务 A 修改了一条数据,但还没提交。 事务 B 这时读到了这条修改后的数据。
如果事务 A 最后回滚了,那么事务 B 读到的就是“脏数据”。
面试答法
脏读指的是一个事务读取到了另一个事务尚未提交的数据,而这些数据后续可能会回滚,因此是不可靠的。
9. 不可重复读
一句话理解
同一个事务里,多次读取同一条数据,结果不一样。
场景
事务 A 先读了一次某条记录。 事务 B 修改并提交了这条记录。 事务 A 再读一次,发现结果变了。
这就叫不可重复读。
面试答法
不可重复读指的是在一个事务中,多次读取同一条记录时,结果不一致,通常是因为其他事务在中间修改并提交了这条数据。
10. 幻读
一句话理解
同一个事务里,多次按条件查询,记录条数变了。
场景
事务 A 查询“年龄大于 20 的学生”,第一次查到 5 条。 事务 B 插入了一条年龄大于 20 的学生记录并提交。 事务 A 再查一次,结果变成 6 条。
这多出来的一条就像“幻影”一样,所以叫幻读。
面试答法
幻读指的是在一个事务中,按相同条件多次查询时,结果集的行数发生变化,通常是因为其他事务插入或删除了满足条件的记录。
11. 脏读、不可重复读、幻读怎么区分
这是你一定要搞清楚的。
| 问题 | 本质 |
|---|---|
| 脏读 | 读到了别人还没提交的数据 |
| 不可重复读 | 同一行数据前后读出来不一样 |
| 幻读 | 同一条件查询前后记录数不一样 |
最简单记忆法
- 脏读:读脏数据
- 不可重复读:同一行变了
- 幻读:多了或少了几行
12. 四种事务隔离级别
SQL 标准里常见有四种隔离级别:
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
隔离级别越高,数据越安全,但并发性能通常越差。
12.1 Read Uncommitted
中文
读未提交
含义
一个事务可以读到另一个事务还没提交的数据。
问题
- 可能出现脏读
- 也可能出现不可重复读和幻读
面试理解
这是隔离性最弱的级别。
12.2 Read Committed
中文
读已提交
含义
一个事务只能读到其他事务已经提交的数据。
能解决什么
- 解决脏读
还可能有什么问题
- 仍可能出现不可重复读
- 仍可能出现幻读
面试理解
这是很多数据库的常见默认级别,但 MySQL InnoDB 默认不是它。
12.3 Repeatable Read
中文
可重复读
含义
同一个事务中,多次读取同一条记录,结果保持一致。
能解决什么
- 解决脏读
- 解决不可重复读
幻读呢
理论上标准定义下仍可能有幻读问题,但在 MySQL InnoDB 中,通常会结合 MVCC 和锁机制对幻读进行处理。
面试理解
MySQL InnoDB 的默认隔离级别就是:
Repeatable Read
这个一定要记住。
12.4 Serializable
中文
串行化
含义
让事务像排队一样串行执行,隔离性最强。
能解决什么
- 脏读
- 不可重复读
- 幻读
代价
- 并发性能最差
面试理解
这是最安全但最慢的隔离级别。
13. 四种隔离级别总结表
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 |
| Read Committed | 解决 | 可能 | 可能 |
| Repeatable Read | 解决 | 解决 | 标准下可能,MySQL 中通常可处理 |
| Serializable | 解决 | 解决 | 解决 |
14. 面试怎么回答“数据库隔离级别有哪些”
标准回答
数据库常见有四种隔离级别,分别是读未提交、读已提交、可重复读和串行化。隔离级别越高,并发安全性越好,但性能开销也越大。读未提交可能出现脏读;读已提交解决脏读,但还可能有不可重复读和幻读;可重复读解决脏读和不可重复读;串行化隔离性最强,可以避免脏读、不可重复读和幻读。
15. MySQL 默认隔离级别是什么
标准回答
MySQL InnoDB 存储引擎默认的事务隔离级别是 Repeatable Read,也就是可重复读。
这个是特别高频的固定题。
16. 隔离级别越高越好吗
标准回答
隔离级别并不是越高越好。虽然更高的隔离级别可以减少并发问题,但同时也会降低并发性能,所以实际选择时需要在数据一致性和系统性能之间做权衡。
17. 一套事务面试的完整答法
如果面试官让你讲事务,你可以这样答:
事务是数据库中一组逻辑操作单元,这组操作要么全部成功,要么全部失败回滚,
它主要是为了保证多步操作中的数据一致性。
事务有 ACID 四个特性,分别是原子性、一致性、隔离性和持久性。
在并发场景下,如果隔离性不足,可能会出现脏读、不可重复读和幻读。
数据库常见有四种隔离级别:读未提交、读已提交、可重复读和串行化。
其中 MySQL InnoDB 默认的隔离级别是可重复读。
一般来说,隔离级别越高,数据越安全,但并发性能也会更差。如果你能比较顺地说出这段,事务这一块就已经很像面试答案了。
18. 本课高频面试题
18.1 什么是事务
标准回答
事务是数据库中一组逻辑上的操作单元,这组操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和正确性。
18.2 事务的 ACID 是什么
标准回答
ACID 分别是原子性、一致性、隔离性和持久性。原子性表示要么全成功要么全失败;一致性表示事务前后数据库要保持正确状态;隔离性表示并发事务之间尽量互不干扰;持久性表示事务提交后结果会被永久保存。
18.3 什么是脏读
标准回答
脏读指的是一个事务读取到了另一个事务尚未提交的数据,而这些数据后续可能会回滚,因此是不可靠的。
18.4 什么是不可重复读
标准回答
不可重复读指的是同一个事务中多次读取同一条记录时,结果不一致,通常是因为其他事务中途修改并提交了这条数据。
18.5 什么是幻读
标准回答
幻读指的是同一个事务中按相同条件多次查询时,结果集的记录数发生变化,通常是因为其他事务插入或删除了满足条件的记录。
18.6 数据库隔离级别有哪些
标准回答
数据库常见的事务隔离级别有四种:读未提交、读已提交、可重复读和串行化。隔离级别越高,隔离性越强,但性能开销也越大。
18.7 MySQL 默认隔离级别是什么
标准回答
MySQL InnoDB 默认的事务隔离级别是可重复读,也就是 Repeatable Read。
19. 本课最小记忆卡片
卡片 1
- 事务:一组操作,要么都成功,要么都失败
卡片 2
- ACID
- A:原子性
- C:一致性
- I:隔离性
- D:持久性
卡片 3
- 脏读:读到未提交数据
- 不可重复读:同一行前后不一样
- 幻读:同条件查出来的行数变了
卡片 4
- 四种隔离级别
- RU:读未提交
- RC:读已提交
- RR:可重复读
- Serializable:串行化
卡片 5
- MySQL InnoDB 默认隔离级别:RR
卡片 6
- 隔离级别越高:一致性更强,性能更差
20. 课后练习
20.1 口头复述题
请你尝试不看讲义回答:
- 什么是事务?
- ACID 分别是什么?
- 什么是脏读、不可重复读、幻读?
- 数据库四种隔离级别分别是什么?
- MySQL 默认隔离级别是什么?
- 为什么隔离级别不是越高越好?
20.2 场景思考题
- 为什么转账场景一定需要事务?
- 为什么并发事务会出现读到不一致数据的问题?
- 如果一个系统特别强调一致性,你会更倾向选择更高还是更低的隔离级别?
20.3 今日最低完成标准
如果今天时间不多,至少完成下面任务:
- 背会本课 6 张最小记忆卡片
- 能完整回答事务和 ACID
- 能清楚区分脏读、不可重复读、幻读
- 记住 MySQL 默认隔离级别是
Repeatable Read
21. 下一课预告
第五课:锁、MVCC 与数据库并发控制