版本可见性

共 22 题
#

1. MVCC 与锁的关系,MVCC 减少锁、但仍需锁处理写写冲突?

A MVCC 完全消除了锁,数据库不需要任何锁
B MVCC 与锁是同一机制的两种叫法
C MVCC 只解决写写冲突,读操作全部加锁
D MVCC 主要解决读写阻塞,但写写冲突仍需通过锁处理 ✓ 正确答案
#

2. MVCC 与隔离级别的关系,不同隔离级别对应不同快照策略?

A 隔离级别与快照策略无关,只影响锁
B 所有隔离级别都使用同一快照策略
C RR 每个语句都新建快照,RC 复用同一快照
D RC 每个语句新建快照,RR 在事务内复用同一快照 ✓ 正确答案
#

3. MVCC(Multi-Version Concurrency Control)的核心思想,读写不阻塞、写写冲突?

A 通过多版本让读写不阻塞,但写写冲突仍需处理 ✓ 正确答案
B 通过加锁实现所有操作的串行化
C 只允许一个事务同时操作,彻底消除并发
D MVCC 不存储旧版本,只更新最新值
#

4. MySQL InnoDB MVCC 实现,每行存储 DB_TRX_ID、DB_ROLL_PTR 指向 undo log?

A DB_ROLL_PTR 指向 undo log,用于构建历史版本链 ✓ 正确答案
B 每行只存 DB_TRX_ID,不存回滚指针
C 版本链存储在数据文件中,与 undo log 无关
D DB_TRX_ID 记录的是行被读取的次数
#

5. PostgreSQL MVCC 实现,每行存储 xmin(创建事务 ID)与 xmax(删除事务 ID)?

A 旧版本存放在 undo log 中
B 每行通过 xmin/xmax 标记创建与删除它的事务 ✓ 正确答案
C PostgreSQL 不使用事务 ID,只靠时间戳
D 每行只存一个 xmax,不存 xmin
#

6. 快照(Snapshot)的构造,当前活跃事务 ID 集合?

A 快照只记录一个事务 ID,不关心其他事务
B 快照构造与活跃事务无关,固定为全局常量
C 快照保存的是所有未来将要执行的事务
D 快照的核心是当前活跃事务 ID 集合,用于判断版本可见性 ✓ 正确答案
#

7. MVCC 版本的膨胀问题,长事务导致 undo 堆积?

A 版本膨胀由磁盘损坏引起,与事务无关
B 长事务会拖住最老活跃事务,使旧版本无法回收导致膨胀 ✓ 正确答案
C 短事务比长事务更容易导致版本膨胀
D 版本膨胀只影响查询速度,不影响存储空间
#

8. MySQL InnoDB undo log 的结构与 purge 线程?

A update undo 需保留用于 MVCC,purge 在其不再被引用时清理 ✓ 正确答案
B purge 线程负责清理所有已被任何事务读取过的 undo
C undo log 不参与 MVCC,只用于事务回滚
D purge 线程会立即删除所有已提交事务的 undo
#

9. PostgreSQL VACUUM 与 autovacuum 的工作机制,标记死元组、回收空间?

A VACUUM 每次都会获取排他锁并重写表
B VACUUM 只做行锁的清理,不涉及空间回收
C autovacuum 根据死元组数量超过阈值自动触发清理 ✓ 正确答案
D 死元组一旦产生就立即被数据库删除
#

10. Undo Log(PostgreSQL 中 heap tuple + xmax 标记)的实现?

A PostgreSQL 使用独立的 undo log 文件存储旧版本
B PostgreSQL 更新时直接覆盖旧值,不保留任何历史
C PostgreSQL 通过插入新元组并用 xmax 标记旧元组来保留历史版本 ✓ 正确答案
D PostgreSQL 的 MVCC 依赖 InnoDB 的回滚段
#

11. VACUUM FULL 与 VACUUM 的差异,原地 vs 重写表?

A 普通 VACUUM 重写表并归还空间给操作系统
B VACUUM FULL 不阻塞任何并发操作
C 两者都获取排他锁
D VACUUM FULL 获取排他锁并重写表,真正归还空间 ✓ 正确答案
#

12. VACUUM 阻塞的常见场景,长事务、临时表?

A 短事务会无限阻塞 VACUUM
B 长事务会拖住 oldest xmin,使 VACUUM 无法清理死元组 ✓ 正确答案
C VACUUM 永远不会被任何事务阻塞
D 只有临时表会阻塞 VACUUM
#

13. InnoDB Read View 的创建时机在 RC(每条语句创建新 Read View)与 RR(事务首次读创建并复用)上有何差异?这如何决定不可重复读与幻读的可见性行为?

A RC 事务内复用同一 Read View,RR 每条语句新建
B 两种级别都事务内复用同一个 Read View
C 两种级别都每个语句新建 Read View
D RC 每条语句新建 Read View,RR 事务首次读创建并复用 ✓ 正确答案
#

14. MVCC 与 GC,PostgreSQL VACUUM、MySQL purge 线程?

A MySQL 用 purge 线程清理 undo 历史版本,PostgreSQL 用 VACUUM 回收死元组 ✓ 正确答案
B PostgreSQL 用 purge 线程回收死元组
C MVCC 历史版本永远不需要回收
D 两者都立即删除所有历史版本
#

15. VACUUM 的调优参数,autovacuum_vacuum_threshold、autovacuum_vacuum_scale_factor?

A 触发公式为死元组数 > 当前元组数
B 触发公式为死元组数 > threshold + scale_factor × 当前元组数 ✓ 正确答案
C autovacuum 只按固定时间触发
D scale_factor 越大清理越频繁
#

16. PostgreSQL 的 oldest xmin(最老活跃事务下界)如何同时决定版本可见性边界与 VACUUM 冻结/清理时机?长事务为何会拖住 xmin 导致膨胀与回卷风险?

A oldest xmin 只影响可见性,不影响 VACUUM
B VACUUM 可以清理比 oldest xmin 更新的版本
C 长事务拖住 xmin 不仅导致膨胀,还会引发事务 ID 回卷风险 ✓ 正确答案
D oldest xmin 与事务 ID 循环无关
#

17. RR 快照读下 UPDATE 发现目标行已被其他事务修改提交时,PostgreSQL 的 EvalPlanQual 重检查与 InnoDB 的当前读分别如何处理?为何能防止丢失更新?

A PostgreSQL 会默默丢弃更新而不重检查
B 两者都会直接覆盖已提交的修改
C PostgreSQL 用 EvalPlanQual 重检查,InnoDB 用当前读加锁,均防止丢失更新 ✓ 正确答案
D InnoDB 对 UPDATE 使用快照读
#

18. MySQL DB_TRX_ID 与 DB_ROLL_PTR?

A DB_TRX_ID 用于判断可见性,DB_ROLL_PTR 用于回溯旧版本 ✓ 正确答案
B 两者都指向 undo log
C DB_ROLL_PTR 记录事务 ID,DB_TRX_ID 指向旧版本
D 二者与 MVCC 无关
#

19. PostgreSQL VACUUM 的作用?

A 只回收死元组,不更新统计信息
B VACUUM 与事务 ID 回卷无关
C VACUUM 会获取排他锁阻塞所有读写
D 回收死元组、更新可见性映射、冻结过旧事务 ID ✓ 正确答案
#

20. PostgreSQL xmin 与 xmax?

A xmin 表示删除元组的事务,xmax 表示创建元组的事务
B xmin 表示创建元组的事务 ID,xmax 表示删除/更新元组的事务 ID ✓ 正确答案
C 两者都表示创建时间戳
D xmin 与 xmax 之和等于事务 ID
#

21. MVCC 版本膨胀的成因与治理,长事务与未提交事务如何阻止旧版本回收,膨胀率如何量化、VACUUM 与在线整理如何选?

A 膨胀只由磁盘满引起,与事务无关
B 长事务阻止旧版本回收,膨胀率需量化,严重时用 pg_repack 在线整理 ✓ 正确答案
C VACUUM FULL 应作为日常默认清理手段
D 膨胀率无法量化,只能凭经验
#

22. VACUUM FULL 的代价,获取 ACCESS EXCLUSIVE 锁并重写表带来的阻塞窗口,与普通 VACUUM 的回收程度差异,何时值得用 pg_repack 替代?

A VACUUM FULL 获取排他锁重写表,阻塞严重但回收彻底 ✓ 正确答案
B VACUUM FULL 不阻塞并发,可自由使用
C pg_repack 需要比 VACUUM FULL 更长的排他锁
D 普通 VACUUM 与 VACUUM FULL 回收程度相同