数据库系统工程师 · 高频练习

严格两段锁为什么要把写锁一直持有到事务提交?

中级 单选题 第 914 题 中等 数据库系统工程师严格两段锁2PL并发控制级联回滚
题目

事务 T1 修改数据项 X 后尚未提交。按照严格两段锁协议,T1 对 X 的排他锁应当()。

A 写完 X 后立即释放,让其他事务先读取新值
B 至少持有到 T1 提交或回滚,再允许冲突访问
C 转换成意向锁后立即允许所有事务写入
D 只在发生死锁时才申请排他锁
题目类型:原创高频练习题 用途:用于帮助理解数据库系统工程师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

严格两段锁要求事务的排他锁保持到提交或回滚。其他事务不能在 T1 结果未确定时读取或覆盖该数据,从而避免读取未提交数据,并减少由 T1 回滚引发的级联回滚。

选项分析

A

错误。其他事务会有机会读取未提交值,可能导致脏读和级联回滚。

B

正确。排他锁保留到事务结束是严格 2PL 的关键约束。

C

错误。意向锁用于多粒度锁层次协调,不能替代数据项上的冲突保护。

D

错误。排他锁应在写数据前获取,不是死锁发生后补申请。

本题为什么容易错

基本两段锁的“收缩阶段可以解锁”容易让人误以为写完就能放。题目加了“严格”二字,写锁释放边界就被推迟到事务结束。

先看结论

简短答案

严格两段锁为什么要把写锁一直持有到事务提交,正确答案是 B(至少持有到 T1 提交或回滚,再允许冲突访问)。严格两段锁要求事务的排他锁保持到提交或回滚。其他事务不能在 T1 结果未确定时读取或覆盖该数据,从而避免读取未提交数据,并减少由 T1 回滚引发的级联回滚。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
写完 X 后立即释放,让其他事务先读取新值 本题干扰项 错误。其他事务会有机会读取未提交值,可能导致脏读和级联回滚。 看到该词不要急着选,先判断是否真正解决题干问题
至少持有到 T1 提交或回滚,再允许冲突访问 本题正确答案 正确。排他锁保留到事务结束是严格 2PL 的关键约束。 看到题干核心场景时优先联想到它
转换成意向锁后立即允许所有事务写入 本题干扰项 错误。意向锁用于多粒度锁层次协调,不能替代数据项上的冲突保护。 看到该词不要急着选,先判断是否真正解决题干问题
只在发生死锁时才申请排他锁 本题干扰项 错误。排他锁应在写数据前获取,不是死锁发生后补申请。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • 写完 X 后立即释放,让其他事务先读取新值:错误。其他事务会有机会读取未提交值,可能导致脏读和级联回滚。
  • 转换成意向锁后立即允许所有事务写入:错误。意向锁用于多粒度锁层次协调,不能替代数据项上的冲突保护。
  • 只在发生死锁时才申请排他锁:错误。排他锁应在写数据前获取,不是死锁发生后补申请。
复习

知识点详解

基本两段锁将事务分成只获取锁的增长阶段和只释放锁的收缩阶段,可保证冲突可串行化,但并不自动保证良好恢复性。严格 2PL 通常要求排他锁持有到结束;强严格 2PL 则常要求共享锁和排他锁都持有到结束。具体术语应按题目教材定义判断。锁等待形成环路时仍可能死锁,需要另行检测、超时或预防。

备考速记

写结果没提交,写锁先别交。

2PL 在级联回滚场景中的作用

2PL在本题中的核心价值,是解决“事务 T1 修改数据项 X 后尚未提交。按照严格两段锁协议,T1 对 X 的排他锁应当()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。

拓展

同类题怎么考

  • 判断某个锁释放时机是否符合严格 2PL。
  • 比较可恢复、无级联和严格调度之间的约束。
2PL 在数据库系统工程师软考中的考法

软考选择题通常不会只考概念定义,还会把2PL放到级联回滚场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。

解题思路

假设 T1 把库存从 10 改成 9,锁一放,T2 立刻读到 9 并据此创建订单。随后 T1 回滚,库存又回到 10,T2 的业务基础就塌了,只能跟着回滚。严格 2PL 的做法很朴素:T1 没有最终表态前,写锁不放。别人等一会儿,换来的是不读“可能作废”的结果。

考点定位

基本 2PL 关注加锁阶段和解锁阶段以保证冲突可串行化;严格 2PL 进一步约束写锁释放时间,改善恢复性质。

易错提醒

  • 把严格 2PL 与所有锁都持有到提交的强严格 2PL 混淆。
  • 认为严格 2PL 可以从根本上消除死锁。
  • 只背可串行化结论,没有理解脏读和级联回滚。

备考提示

  • 用一条时间线画 T1 写、T2 读、T1 回滚,恢复性质马上清楚。
  • 分别记住 2PL 解决调度冲突,严格性改善恢复,死锁仍需检测或预防。

你可能还想了解

  • 基本两段锁和严格两段锁有什么区别?
  • 严格 2PL 能避免死锁吗?
  • 什么是级联回滚?

本文小结

严格两段锁把排他锁保留到事务提交或回滚,避免其他事务读取尚未确定的写入结果,从而减少脏读和级联回滚。它改善恢复性质,但并不自动消除死锁。