脏读与不可重复读

共 19 题
#

1. READ COMMITTED 下不可重复读的发生,每条语句看到最新已提交?

A 整个事务只生成一个快照,所有语句看到相同数据
B READ COMMITTED 下不会发生不可重复读
C 每条 SELECT 语句都新建一个 Read View,因此两次读取可能看到不同已提交数据 ✓ 正确答案
D READ COMMITTED 下每条语句看到的是事务开始时的数据
#

2. READ UNCOMMITTED 下脏读的发生,PG 无脏读,MySQL 也实现无脏读?

A MySQL 和 PostgreSQL 都严格按标准产生脏读
B 只有 PostgreSQL 会产生脏读
C 由于 MVCC 机制,MySQL 和 PostgreSQL 实际上都不产生脏读
D 只有 MySQL 会产生脏读 ✓ 正确答案
#

3. 不可重复读(Non-Repeatable Read)的定义,同一事务中两次读取结果不同?

A 同一事务内读取到其他事务未提交的数据
B 同一事务内两次读取同一行,得到不同内容 ✓ 正确答案
C 同一事务内两次查询返回的行集合不同
D 不同事务读取同一行数据得到相同结果
#

4. MVCC 下的快照读与当前读,为什么 RC/RR 的快照读不产生脏读,当前读(加锁读)看到的是最新已提交?

A 快照读和当前读读取相同的数据
B 当前读不加锁,快照读加锁
C 快照读基于 Read View 读历史已提交版本,当前读加锁读最新已提交数据 ✓ 正确答案
D 快照读读取最新已提交数据,当前读读取历史版本
#

5. 当前读(加锁读)在 RC/RR 下读取最新已提交数据,与快照读混用时的数据一致性边界

A 混用不会影响数据一致性
B 当前读看到的也是固定快照
C 快照读和当前读可见的数据版本可能不同,混用会破坏事务内读一致性 ✓ 正确答案
D 快照读加锁,当前读不加锁
#

6. MySQL 可重复读下二级索引回表为何可能读到半新半旧的数据?MVCC 如何保证聚簇索引与二级索引的可见性一致?

A 只有二级索引能用于 MVCC 可见性判断
B 二级索引独立维护版本信息,无须回表
C 回表时依据聚簇索引记录中的版本信息与 Read View 判断可见版本,保证一致性 ✓ 正确答案
D 二级索引回表可能读到不同版本数据,无法保证一致性
#

7. 脏读场景为什么很少见,READ UNCOMMITTED 在主流数据库中的实现差异与适用边界?

A 所有数据库的 RU 都能产生脏读
B RU 会阻止并发写入
C RU 适用于所有业务场景
D 脏读少见是因为业务很少选用 RU,且 PostgreSQL 将 RU 实现为等价于 RC 不产生脏读,而 MySQL 的 RU 仍可能产生脏读 ✓ 正确答案
#

8. 脏读(Dirty Read)的定义,读取到其他事务未提交的数据?

A 两次查询返回的行集合不同
B 读取到事务开始前已提交的数据
C 读取到其他事务未提交的数据 ✓ 正确答案
D 同一事务内两次读取同一行内容不同
#

9. 不可重复读的工程影响,同一事务内两次读不一致对统计、报表、缓存更新的影响与应对?

A 对统计报表无任何影响
B 会导致同一事务内多次读取结果不一致,宜用 RR 或加锁读保证稳定 ✓ 正确答案
C 只能通过降低隔离级别解决
D 缓存更新不需要考虑读一致性
#

10. MVCC 的实现要素,隐藏列(trx_id/roll_pointer)、undo log 版本链、Read View 的生成时机?

A 只有隐藏列 trx_id,没有版本链
B 隐藏列、undo 版本链与 Read View 共同决定可见版本,生成时机取决于隔离级别 ✓ 正确答案
C roll_pointer 指向最新版本
D Read View 每行都单独生成
#

11. Read View 的可见性规则,trx_id 与活跃事务列表如何判断?

A 结合事务 ID 与活跃事务列表判断该版本是否已提交,未提交则不可见 ✓ 正确答案
B 只要事务 ID 小于最大 ID 就可见
C 只有当前事务写的版本可见
D 所有版本都可见
#

12. 隔离级别与 MVCC 的实现,RC/RR 的快照生成时机?

A RC 完全不用快照
B RC 和 RR 都在事务开始生成一次
C RR 每条语句生成新快照
D RC 每条语句生成新快照,RR 事务内首次读生成并复用 ✓ 正确答案
#

13. PostgreSQL 默认 RC 与 MySQL 默认 RR 的差异及对业务的影响

A 两者都默认 RR
B 两者都默认 RC
C 默认级别不影响并发行为
D PG 默认 RC,MySQL 默认 RR,导致快照读语义不同 ✓ 正确答案
#

14. 不同隔离级别下"读到什么"的口诀,RC 每次语句新建 Read View、RR 事务首查新建、如何用实验验证?

A 查看 undo 日志大小
B 观察锁等待时间
C 两事务中先读后由另一事务提交更新,再读,观察结果是否变化 ✓ 正确答案
D 观察事务回滚次数
#

15. MySQL 默认 autocommit=1 时每条语句都是独立事务,长连接中未显式提交的事务会让 Read View 长期保留,对快照与 undo 清理有何影响?

A 长事务不影响 undo 清理
B autocommit=1 会让 undo 永久膨胀
C purge 线程只清理未提交的 undo
D 长事务的 Read View 长期保留,导致 undo 无法及时清理而膨胀 ✓ 正确答案
#

16. 长事务或长查询为什么会导致 undo 日志膨胀与版本链变长?purge 线程的清理边界是什么?

A purge 可以清理所有 undo
B purge 只能清理不再被任何活跃 Read View 需要的旧版本,长事务会阻碍清理 ✓ 正确答案
C 长查询不会影响 undo 清理
D purge 与 undo 膨胀无关
#

17. RC 下两次 SELECT 之间其他事务提交如何改变结果集?如何用 REPEATABLE READ 或加锁读稳定结果?

A 增加事务数量
B 只能降低隔离级别
C 改用 RR 或对读取加锁 ✓ 正确答案
D 关闭 MVCC
#

18. 事务隔离级别在并发编程中的类比,与 Java 内存模型?

A 两者无关
B 两者都处理并发下的可见性与一致性保证问题 ✓ 正确答案
C JMM 只关注性能,不关注一致性
D 隔离级别与 JMM 概念的机制完全相同
#

19. 基于表锁的存储引擎(如 MyISAM)读写互斥,为什么天然不存在脏读与不可重复读?

A 通过读写互斥的表锁串行化访问,天然无脏读与不可重复读 ✓ 正确答案
B 表锁会导致严重的脏读
C 表锁支持高并发读写
D 表锁与 MVCC 效果相同