幻读与写偏斜

共 19 题
#

1. REPEATABLE READ 下幻读的防止,Next-Key Lock 或快照读?

A 只靠快照读防止
B 只靠间隙锁防止
C 快照读靠 Read View 复用,当前读靠 Next-Key Lock,两者共同防止 ✓ 正确答案
D RR 下无法防止幻读
#

2. 写偏斜的检测,PostgreSQL SSI 在 SERIALIZABLE 级别下捕获?

A SSI 完全不检测写偏斜
B SSI 只加锁不检测
C SSI 通过跟踪读写依赖并在提交时检测依赖环来中止可能破坏串行化的事务 ✓ 正确答案
D SERIALIZABLE 下不可能发生写偏斜
#

3. 写偏斜(Write Skew)的定义,两个事务基于各自读到的快照写入冲突但各自提交?

A 两个事务写同一行互相覆盖
B 写偏斜就是丢失更新
C 两个事务基于各自快照写不同行但违反业务约束,且都能提交 ✓ 正确答案
D 行锁能完全防止写偏斜
#

4. 幻读与不可重复读的根本差异,行集合变化 vs 行属性变化?

A 都是行属性变化
B 都是行集合变化
C 两者完全相同
D 不可重复读是行属性变化,幻读是行集合变化 ✓ 正确答案
#

5. InnoDB 在 RR 下如何用 Next-Key Lock 防止幻读,对索引记录加间隙锁/临键锁的范围与死锁代价?

A 记录锁 + 间隙锁,锁定范围较大,能防幻读但会增加锁冲突与死锁 ✓ 正确答案
B 只加记录锁
C 只在 RC 下使用
D 只加间隙锁
#

6. 为什么 MVCC 快照读看到旧版本而当前读看到最新版本,二者混用(先查后改)会破坏哪些一致性假设

A 混用不会破坏一致性
B 判断基于旧快照而写入基于最新数据,可能造成丢失更新或写偏斜 ✓ 正确答案
C 当前读看到的也是旧版本
D 快照读和当前读永远一致
#

7. 幻读(Phantom Read)的定义,同一查询返回不同行集?

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

8. 写偏斜的解决,SERIALIZABLE 隔离、显式锁、应用层约束?

A 可借助 SERIALIZABLE、显式锁和应用层约束组合解决 ✓ 正确答案
B 加行锁即可完全解决
C 无法解决
D 只能靠行锁
#

9. 快照读 vs 当前读下的幻读,为什么 RR 快照读看不到幻行、但当前读(SELECT FOR UPDATE)可能看到?

A 只有快照读会看到幻行
B 快照读和当前读都看不到幻行
C 两者都看得到幻行
D 快照读靠 Read View 复用看不到幻行,当前读读最新数据,靠临键锁防幻读 ✓ 正确答案
#

10. 为什么数据库无法自动防止写偏斜?业务侧如何用唯一约束、约束触发器或提升隔离级别系统性兜底?

A 默认隔离级别即可自动防止
B 需业务侧用唯一约束、触发器或提升到 SERIALIZABLE 从数据层面兜底 ✓ 正确答案
C 只能靠应用层完全不写
D 行锁完全能防止
#

11. 写偏斜的经典场景,值班排班、余额互转、库存双写,为什么加行锁无法解决、需要串行化或显式锁表?

A 加行锁即可完全解决
B 写偏斜锁不住对方判断依据的行,需串行化、锁表或 SERIALIZABLE 解决 ✓ 正确答案
C 写偏斜无法在数据库内解决
D 写偏斜只发生在同一行
#

12. RR 下当前读的幻读,SELECT FOR UPDATE 与临键锁?

A 不加锁
B 加临键锁(记录锁 + 间隙锁)锁定范围及间隙,阻止插入新行 ✓ 正确答案
C 只加记录锁
D 只靠快照读
#

13. SSI 检测写偏斜的机制,rw-antidependency 与提交时冲突检查

A SSI 靠阻塞读写来防写偏斜
B SSI 跟踪 rw-antidependency,提交时检测依赖环并中止冲突事务 ✓ 正确答案
C SSI 只在写入时加锁
D SSI 不检测任何依赖
#

14. 业务层如何设计约束使写偏斜不可能发生(冗余列、唯一约束、锁表)

A 冗余列、唯一约束、锁表可把跨行约束转化为数据库可强制或可串行化的形式 ✓ 正确答案
B 只能靠加锁
C 写偏斜无法通过设计避免
D 唯一约束无法防写偏斜
#

15. 隔离级别与一致性的完整矩阵,脏读、不可重复读、幻读与写偏斜在各隔离级别下是否可能发生,SERIALIZABLE 如何一并消除?

A RC 也能消除幻读
B RR 消除脏读和不可重复读,SERIALIZABLE 消除所有异常包括写偏斜 ✓ 正确答案
C RU 无任何异常
D 所有隔离级别都可能发生写偏斜
#

16. 应用层对写偏斜的兜底,在无法使用 SERIALIZABLE 时,如何用唯一约束、条件更新与锁升级在应用层防止约束违背?

A 只能提升隔离级别
B 条件更新把判断与写入合并为原子语句,配合唯一约束和锁升级可防约束违背 ✓ 正确答案
C 条件更新无法防写偏斜
D 只能靠应用层锁
#

17. 快照隔离的提交冲突,为什么 SI 下两个并发事务同时写同一行时后提交者会失败,与悲观锁冲突相比的体验差异?

A 两者都在执行时阻塞
B 快照隔离不检测冲突
C 快照隔离在写在冲突时立即失败,悲观锁在提交时失败
D 快照隔离在提交时后提交者失败,悲观锁在写操作时阻塞等待 ✓ 正确答案
#

18. 串行化快照隔离(SSI)的原理,如何通过读写依赖跟踪检测冲突环,相比锁实现的并发度优势?

A SSI 阻塞所有读写,并发度低
B SSI 允许读写并发,靠提交时检测依赖环中止冲突事务,读多写少时并发度更高 ✓ 正确答案
C SSI 与锁实现完全相同
D SSI 不检测冲突
#

19. 幻读的工程场景,库存区间统计、报表行数不一致,如何用 SERIALIZABLE 或加锁读解决?

A 幻读无法解决
B 只能降低隔离级别
C 加锁读反而会增加幻读
D 可用 SERIALIZABLE 或加锁读(临键锁)使统计期间行集合稳定 ✓ 正确答案