【计算机基础速成】第四课:事务、ACID 与隔离级别

4 小时前(已编辑)
1

【计算机基础速成】第四课:事务、ACID 与隔离级别

1. 这节课的目标

事务是数据库面试中的另一块核心高频区。

面试官经常会问:

  • 什么是事务?
  • 事务的 ACID 是什么?
  • 什么是脏读、不可重复读、幻读?
  • 数据库隔离级别有哪些?
  • MySQL 默认隔离级别是什么?
  • 隔离级别越高越好吗?

这节课学完后,你至少要做到:

  • 能说清事务是什么
  • 能背出 ACID
  • 能分清脏读、不可重复读、幻读
  • 能说出四种隔离级别及其解决的问题
  • 能回答 MySQL 默认隔离级别

2. 什么是事务

一句话理解

事务就是一组操作,要么都成功,要么都失败。

生活化例子

比如转账:

  1. A 账户扣 100 元
  2. B 账户加 100 元

这两个动作必须一起成功。

如果 A 扣了钱,但 B 没收到钱,就出问题了。

所以这两个操作必须放进一个事务里,保证:

  • 要么都执行成功
  • 要么都不生效

3. 面试怎么回答“什么是事务”

标准回答

事务是数据库中一组逻辑上的操作单元,这组操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和正确性。

关键词

  • 一组操作
  • 逻辑单元
  • 要么都成功
  • 要么都回滚
  • 保证数据一致性

4. 为什么需要事务

如果没有事务,在多步操作中只要中间某一步失败,就可能造成数据不一致。

例子

还是转账场景:

  • 第一步:A 扣钱成功
  • 第二步:B 加钱失败

这时数据库状态就错了。

事务的价值就是:

保证多步操作在逻辑上是一个整体。


5. ACID 是什么

这是事务最经典的面试题。

ACID 是事务的四个特性:

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔离性
  • Durability:持久性
Mermaid Loading...

5.1 原子性 Atomicity

一句话理解

事务中的操作不可再分,要么全做,要么全不做。

面试答法

原子性指的是事务中的所有操作要么全部成功,要么全部失败,不会只执行一部分。


5.2 一致性 Consistency

一句话理解

事务执行前后,数据要保持合法、正确的状态。

面试答法

一致性指的是事务执行前后,数据库都必须从一个一致状态转换到另一个一致状态,不能破坏数据的业务规则和约束。

怎么理解

比如转账前后,总金额应该保持不变,这就是一致性。


5.3 隔离性 Isolation

一句话理解

多个事务并发执行时,彼此之间不要互相干扰。

面试答法

隔离性指的是多个事务并发执行时,一个事务的中间状态对其他事务应该尽量不可见,从而避免并发带来的数据问题。


5.4 持久性 Durability

一句话理解

事务一旦提交,结果就应该被永久保存下来。

面试答法

持久性指的是事务一旦提交,对数据的修改就应该被永久保存,即使系统发生故障,提交结果也不应丢失。


6. ACID 面试标准答法

如果面试官问:

事务的 ACID 是什么?

你可以这样答:

事务有四个基本特性,也就是 ACID。
A 是原子性,表示事务中的操作要么全部成功,要么全部失败;
C 是一致性,表示事务执行前后数据库都要保持一致状态;
I 是隔离性,表示并发事务之间要尽量互不干扰;
D 是持久性,表示事务一旦提交,结果就会被永久保存。

这段你建议直接背。


7. 并发事务会带来什么问题

数据库里经常会有多个事务同时执行,这时候如果隔离做得不够好,就会出现并发问题。

最经典的三种并发问题是:

  • 脏读
  • 不可重复读
  • 幻读
Mermaid Loading...

8. 脏读

一句话理解

读到了别的事务还没提交的数据。

场景

事务 A 修改了一条数据,但还没提交。 事务 B 这时读到了这条修改后的数据。

如果事务 A 最后回滚了,那么事务 B 读到的就是“脏数据”。

面试答法

脏读指的是一个事务读取到了另一个事务尚未提交的数据,而这些数据后续可能会回滚,因此是不可靠的。


9. 不可重复读

一句话理解

同一个事务里,多次读取同一条数据,结果不一样。

场景

事务 A 先读了一次某条记录。 事务 B 修改并提交了这条记录。 事务 A 再读一次,发现结果变了。

这就叫不可重复读。

面试答法

不可重复读指的是在一个事务中,多次读取同一条记录时,结果不一致,通常是因为其他事务在中间修改并提交了这条数据。


10. 幻读

一句话理解

同一个事务里,多次按条件查询,记录条数变了。

场景

事务 A 查询“年龄大于 20 的学生”,第一次查到 5 条。 事务 B 插入了一条年龄大于 20 的学生记录并提交。 事务 A 再查一次,结果变成 6 条。

这多出来的一条就像“幻影”一样,所以叫幻读。

面试答法

幻读指的是在一个事务中,按相同条件多次查询时,结果集的行数发生变化,通常是因为其他事务插入或删除了满足条件的记录。


11. 脏读、不可重复读、幻读怎么区分

这是你一定要搞清楚的。

问题本质
脏读读到了别人还没提交的数据
不可重复读同一行数据前后读出来不一样
幻读同一条件查询前后记录数不一样

最简单记忆法

  • 脏读:读脏数据
  • 不可重复读:同一行变了
  • 幻读:多了或少了几行

12. 四种事务隔离级别

SQL 标准里常见有四种隔离级别:

  1. Read Uncommitted
  2. Read Committed
  3. Repeatable Read
  4. Serializable

隔离级别越高,数据越安全,但并发性能通常越差。

Mermaid Loading...

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 口头复述题

请你尝试不看讲义回答:

  1. 什么是事务?
  2. ACID 分别是什么?
  3. 什么是脏读、不可重复读、幻读?
  4. 数据库四种隔离级别分别是什么?
  5. MySQL 默认隔离级别是什么?
  6. 为什么隔离级别不是越高越好?

20.2 场景思考题

  1. 为什么转账场景一定需要事务?
  2. 为什么并发事务会出现读到不一致数据的问题?
  3. 如果一个系统特别强调一致性,你会更倾向选择更高还是更低的隔离级别?

20.3 今日最低完成标准

如果今天时间不多,至少完成下面任务:

  1. 背会本课 6 张最小记忆卡片
  2. 能完整回答事务和 ACID
  3. 能清楚区分脏读、不可重复读、幻读
  4. 记住 MySQL 默认隔离级别是 Repeatable Read

21. 下一课预告

第五课:锁、MVCC 与数据库并发控制

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...