事务 T1 修改数据项 X 后尚未提交。按照严格两段锁协议,T1 对 X 的排他锁应当()。
严格两段锁要求事务的排他锁保持到提交或回滚。其他事务不能在 T1 结果未确定时读取或覆盖该数据,从而避免读取未提交数据,并减少由 T1 回滚引发的级联回滚。
选项分析
错误。其他事务会有机会读取未提交值,可能导致脏读和级联回滚。
正确。排他锁保留到事务结束是严格 2PL 的关键约束。
错误。意向锁用于多粒度锁层次协调,不能替代数据项上的冲突保护。
错误。排他锁应在写数据前获取,不是死锁发生后补申请。
本题为什么容易错
基本两段锁的“收缩阶段可以解锁”容易让人误以为写完就能放。题目加了“严格”二字,写锁释放边界就被推迟到事务结束。
简短答案
严格两段锁为什么要把写锁一直持有到事务提交,正确答案是 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 能避免死锁吗?
- 什么是级联回滚?
本文小结
严格两段锁把排他锁保留到事务提交或回滚,避免其他事务读取尚未确定的写入结果,从而减少脏读和级联回滚。它改善恢复性质,但并不自动消除死锁。