并发调度 S 对同一数据项 X 的操作顺序为 r1(X)、r2(X)、w1(X)、w2(X)。按冲突操作建立事务前驱图后,对该调度的正确判断是()。
r1(X) 在 w2(X) 之前,形成 T1→T2;r2(X) 在 w1(X) 之前,形成 T2→T1。前驱图中两个事务互相指向,构成环,因此该调度不是冲突可串行化调度。两次只读操作本身不冲突,但读写和写写操作会产生冲突边。
选项分析
错误。除了 T1→T2,还存在由 r2(X) 与 w1(X) 形成的 T2→T1。
错误。除了 T2→T1,还存在由 r1(X) 与 w2(X) 形成的 T1→T2。
正确。前驱图有环,因此不能通过交换非冲突操作变成某个串行调度。
错误。读读不冲突不代表整个调度无冲突,题目中还有跨事务的读写和写写操作。
本题为什么容易错
同学常把“两个读不冲突”扩大成“两个事务不冲突”。判断要看每一对跨事务操作,只要访问同一数据项并且至少一个是写,就要考虑先后关系。
简短答案
事务前驱图出现环,为什么不是冲突可串行化调度,正确答案是 C(同时存在 T1→T2 和 T2→T1,图中有环,不是冲突可串行化调度)。r1(X) 在 w2(X) 之前,形成 T1→T2;r2(X) 在 w1(X) 之前,形成 T2→T1。前驱图中两个事务互相指向,构成环,因此该调度不是冲突可串行化调度。两次只读操作本身不冲突,但读写和写写操作会产生冲突边。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 只有 T1→T2,因此等价于先 T1 后 T2 的串行调度 | 本题干扰项 | 错误。除了 T1→T2,还存在由 r2(X) 与 w1(X) 形成的 T2→T1。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 只有 T2→T1,因此等价于先 T2 后 T1 的串行调度 | 本题干扰项 | 错误。除了 T2→T1,还存在由 r1(X) 与 w2(X) 形成的 T1→T2。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 同时存在 T1→T2 和 T2→T1,图中有环,不是冲突可串行化调度 | 本题正确答案 | 正确。前驱图有环,因此不能通过交换非冲突操作变成某个串行调度。 | 看到题干核心场景时优先联想到它 |
| 两个事务都读取过 X,因此操作之间不存在冲突 | 本题干扰项 | 错误。读读不冲突不代表整个调度无冲突,题目中还有跨事务的读写和写写操作。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 只有 T1→T2,因此等价于先 T1 后 T2 的串行调度:错误。除了 T1→T2,还存在由 r2(X) 与 w1(X) 形成的 T2→T1。
- 只有 T2→T1,因此等价于先 T2 后 T1 的串行调度:错误。除了 T2→T1,还存在由 r1(X) 与 w2(X) 形成的 T1→T2。
- 两个事务都读取过 X,因此操作之间不存在冲突:错误。读读不冲突不代表整个调度无冲突,题目中还有跨事务的读写和写写操作。
知识点详解
冲突操作必须属于不同事务、访问同一数据项,并且至少一个操作是写。建立前驱图时,如果 Ti 的冲突操作先于 Tj,就添加 Ti→Tj。图无环时可以进行拓扑排序,拓扑序给出一个与原调度冲突等价的串行执行顺序;图有环时,各事务之间的先后约束互相矛盾,无法得到等价串行顺序。冲突可串行化是比一般视图可串行化更强、也更容易判定的条件,考试通常以前驱图无环作为判断抓手。
备考速记
速记:同项访问至少一写就看冲突;先做的指向后做的,有环就过不了。
并发控制在并发控制场景中的作用
并发控制在本题中的核心价值,是解决“并发调度 S 对同一数据项 X 的操作顺序为 r1(X)、r2(X)、w1(X)、w2(X)。按冲突操作建立事务前驱图后,对该调度的正确判断是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 给出一串 r、w 操作,要求画前驱图并判断是否冲突可串行化。
- 前驱图无环时,要求写出一个或多个等价串行顺序。
- 比较冲突可串行化、视图可串行化和两段锁协议的关系。
并发控制在数据库系统工程师软考中的考法
软考选择题通常不会只考概念定义,还会把并发控制放到并发控制场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
不要只盯最后两个写操作。老师会让你按数据项逐对检查:不同事务访问同一数据项,且至少一个是写操作,就存在冲突。r1 在 w2 前给出 T1→T2,r2 在 w1 前又给出 T2→T1,环就形成了。
考点定位
判断冲突可串行化的标准是前驱图是否无环。无环时拓扑序对应等价串行顺序;有环时不存在满足全部冲突次序的串行排列。
易错提醒
- 只检查写写冲突,漏掉读写和写读冲突。
- 边的方向写反,应该从先发生操作所属事务指向后发生操作所属事务。
- 看到图中存在拓扑节点就认为可串行化,没有检查是否存在环。
备考提示
- 前驱图无环才有拓扑序,有环就不是冲突可串行化。
- 两段锁协议是保证调度性质的方法之一,前驱图则是拿到具体调度后进行判断的工具,两者不要混成同一个问题。
你可能还想了解
- 哪些读写操作属于事务冲突?
- 事务前驱图的边应该指向哪个方向?
- 前驱图无环时怎样写等价串行顺序?
- 两段锁协议和前驱图判断有什么区别?
本文小结
r1(X) 在 w2(X) 前形成 T1→T2,r2(X) 在 w1(X) 前形成 T2→T1。前驱图出现环,无法得到拓扑序,因此该调度不是冲突可串行化调度。