Skip to content

面试速答(先看这里)

**一句话结论:**所谓快照读,就是读取的是快照数据,即快照生成的那一刻的数据,像我们 常用的普通的SELECT语句在不加锁情况下就是快照读。

60秒标准回答:

所谓快照读,就是读取的是快照数据,即快照生成的那一刻的数据,像我们 常用的普通的SELECT语句在不加锁情况下就是快照读。 如

和快照读相对应的另外一个概念叫做当前读,当前读就是读取最新数据,所以 ,加锁的 SELECT,或者对数据进行增删改都会进行当前读 ,比如

在MySQL 中, 只有READ COMMITTED 和 REPEATABLE READ这两种事务隔离级别才会使用快照读

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**和快照读相对应的另外一个概念叫做当前读,当前读就是读取最新数据,所以 ,加锁的 SELECT,或者对数据进行增删改都会进行当前读 ,比如:
  • **要点2:**在MySQL 中, 只有READ COMMITTED 和 REPEATABLE READ这两种事务隔离级别才会使用快照读。

**记忆锚点:**SELECT → READ → REPEATABLE → COMMITTED → 这两种事务隔离 → 语句在不加锁

追问准备:

  • 围绕「SELECT」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「READ」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「REPEATABLE」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

所谓快照读,就是读取的是快照数据,即快照生成的那一刻的数据,像我们**常用的普通的SELECT语句在不加锁情况下就是快照读。**如:

plain
SELECT * FROM xx_table WHERE ...

和快照读相对应的另外一个概念叫做当前读,当前读就是读取最新数据,所以**,加锁的 SELECT,或者对数据进行增删改都会进行当前读**,比如:

plain
SELECT * FROM xx_table LOCK IN SHARE MODE;

SELECT * FROM xx_table FOR UPDATE;

INSERT INTO xx_table ...

DELETE FROM xx_table ...

UPDATE xx_table ...

在MySQL 中,只有READ COMMITTED 和 REPEATABLE READ这两种事务隔离级别才会使用快照读。

  • 在 RR 中,快照会在事务开始时生成,只有在本事务中对数据进行更改才会更新快照。

  • 在 RC 中,每次读取都会重新生成一个快照,总是读取行的最新版本。