# 1. InnoDB 中 Next-Key Lock 的索引锁实现? A 临键锁锁在数据行上,与索引无关 B 临键锁基于索引记录及其间隙实现,无索引时全表加锁 ✓ 正确答案 C 临键锁只锁二级索引 D 临键锁不需要索引
# 2. PostgreSQL SSI 中的谓词锁实现? A 谓词锁只锁数据行 B SSI 不用锁 C SSI 用谓词锁记录读范围,配合读写反依赖检测串行化异常 ✓ 正确答案 D SSI 与 SERIALIZABLE 无关
# 3. 索引锁(Index Lock),锁定索引项而非数据行? A 索引锁锁定索引项,InnoDB 行锁实际加在聚簇索引项上 ✓ 正确答案 B 索引锁锁定数据行,与索引无关 C 索引锁只存在于 PostgreSQL D 索引锁与行锁无关
# 4. 谓词锁(Predicate Lock)的概念,锁定满足谓词的元组集合? A 谓词锁锁定满足谓词的所有元组集合,支持粒度合并 ✓ 正确答案 B 谓词锁只锁单个元组 C 谓词锁与查询条件无关 D 谓词锁只能锁表
# 5. 锁粒度(Tuple、Page、Relation)的合并策略? A 锁粒度不能合并 B 合并总是提高并发 C 元组→页→表级合并可减少锁开销,但会扩大冲突范围可能误报 ✓ 正确答案 D 合并与锁开销无关
# 6. 死锁的检测,PostgreSQL 与 MySQL 的等待图算法? A 等待图检测不依赖锁 B 等待图检测事务间的循环等待,发现环后回滚一方 ✓ 正确答案 C 死锁检测无需回滚 D 只有 PostgreSQL 用等待图
# 7. 死锁(Deadlock)的产生条件,互斥、占有并等待、非抢占、循环等待? A 只要满足一个条件就死锁 B 死锁需同时满足互斥、占有并等待、非抢占、循环等待四个条件 ✓ 正确答案 C 死锁与锁无关 D 破坏一个条件无法预防死锁
# 8. PostgreSQL SSI 如何用 SIREAD 锁与读写反依赖(rw-antidependency)检测串行化异常(如写偏斜),检测到后如何终止事务? A SSI 检测到异常后自动重试不报错 B SSI 不检测写偏斜 C SSI 用 SIREAD 锁与读写反依赖检测写偏斜等异常,并终止一方事务 ✓ 正确答案 D SSI 与快照隔离无关
# 9. 锁等待队列(Lock Wait Queue)的实现,FIFO? A 锁等待队列随机唤醒 B 锁等待队列总是后到先得 C 锁等待队列大致按 FIFO 排队,保证公平性避免饥饿 ✓ 正确答案 D 锁等待队列不存在
# 10. MySQL 中 OCC 的应用,SELECT ... FOR UPDATE 与版本号? A 版本号与 FOR UPDATE 完全相同 B OCC 用版本号在更新时验证冲突,FOR UPDATE 是悲观锁提前加锁 ✓ 正确答案 C OCC 不加版本也能验证 D FOR UPDATE 是乐观锁
# 11. PostgreSQL 的 SERIALIZABLE 与 OCC 的关系? A SERIALIZABLE 与 OCC 无关 B SERIALIZABLE 是悲观锁 C SERIALIZABLE 通过 SSI 实现,本质是提交时检测冲突的乐观并发控制 ✓ 正确答案 D SSI 不检测冲突
# 12. 乐观并发控制(OCC)与 MVCC 快照隔离的关系,为什么写冲突在提交时检测而读不阻塞?OCC 与 SSI 的冲突检测有何异同? A MVCC 快照让读不阻塞,OCC 在提交时检测写冲突,SSI 用谓词锁检测更广异常 ✓ 正确答案 B OCC 在读时加锁 C OCC 立即检测写冲突 D SSI 与 OCC 检测范围相同
# 13. 乐观并发控制(OCC, Optimistic Concurrency Control)的原理,假设无冲突,提交时验证? A OCC 读时检测冲突 B OCC 提前加锁 C OCC 假设无冲突,读写不加锁,提交时验证冲突,冲突则重试 ✓ 正确答案 D OCC 冲突时直接丢弃
# 14. OCC 与悲观锁(Pessimistic Locking)的取舍? A OCC 永远优于悲观锁 B 低冲突场景用 OCC 换并发,高冲突场景用悲观锁换稳定 ✓ 正确答案 C 悲观锁永远无重试 D 两者无区别
# 15. 版本号(Version Number)与时间戳的实现? A 版本号实现无需 WHERE 条件 B 读取时记录版本或时间戳,更新时用 WHERE 验证基线,不匹配则冲突重试 ✓ 正确答案 C 时间戳实现无法冲突检测 D 版本号与乐观锁无关
# 16. 分布式数据库(如 TiDB)的乐观事务如何在提交阶段检测写写冲突?与悲观锁模式相比在冲突率与重试上的取舍是什么? A TiDB 乐观事务不检测冲突 B TiDB 乐观事务执行时加锁 C TiDB 乐观事务在提交时检测写写冲突,冲突则回滚重试,高冲突时重试成本高 ✓ 正确答案 D 悲观锁模式无锁等待
# 17. PostgreSQL 将 SIREAD 谓词锁合并到页级或表级后,为什么可能误杀本可串行化执行的事务?误报率与锁开销如何权衡? A 合并到页/表级会扩大锁范围、增加误报率,但降低锁开销 ✓ 正确答案 B 合并总是减少误报 C 谓词锁合并不影响冲突 D 合并后锁更精确
# 18. OCC 的 ABA 问题,版本号方案为何能避免 CAS 式比较中的 ABA? A 版本号与 ABA 无关 B 版本号无法避免 ABA C ABA 问题只存在于版本号方案 D 版本号单调递增,即使值恢复也能识别中间修改,从而避免 ABA ✓ 正确答案
# 19. 乐观并发控制的提交期验证有 forward 与 backward 两种方式,它们验证的对象与适用读写比有何差异? A 两者验证对象相同 B backward 验证已提交事务对读数据的影响,适合读多写少;forward 验证活跃事务,适合写多读少 ✓ 正确答案 C backward 适合写多读少 D forward 适合读多写少