谓词锁、死锁与乐观并发控制

共 19 题
#

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 适合读多写少