# 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 回收程度相同