请求提供可串行化但非冲突可串行化的调度示例
可串行化但非冲突可串行化的调度示例
嘿,这有一个经典的例子能清晰展示这类调度的区别,先看三个事务的操作:
- T1:写数据项B (
W1(B)),写数据项A (W1(A)) - T2:写数据项A (
W2(A)),写数据项B (W2(B)) - T3:读数据项A (
R3(A)),读数据项B (R3(B))
我们的调度 S 执行顺序如下:
W1(B), W2(A), R3(A), R3(B), W1(A), W2(B)
为什么它是可串行化调度?
可串行化调度要求存在一个串行调度,与当前调度视图等价。我们看串行调度 T1 → T2 → T3,它的执行顺序是:
W1(B), W1(A), W2(A), W2(B), R3(A), R3(B)
对比两个调度,满足视图等价的三个核心条件:
- 初始读一致性:T1、T2都是直接写数据,没有读取初始值;T3在调度S中读A的值来自T2的写入,读B的值来自T1的写入,这和串行调度
T1→T2→T3中T3的读取来源完全一致。 - 写-读依赖一致:所有读操作依赖的写事务在两个调度中完全匹配。
- 最后写事务一致:数据项A的最后写入者是T1,数据项B的最后写入者是T2,两个调度完全相同。
因此调度S与串行调度T1→T2→T3视图等价,属于可串行化调度。
为什么它不是冲突可串行化调度?
冲突可串行化要求调度与某个串行调度冲突等价,判断依据是冲突图是否存在环(冲突操作指不同事务对同一数据的读-写、写-读、写-写操作)。
我们列出调度S中的所有冲突操作及对应的依赖边:
W1(B)和W2(B):写-写冲突,依赖边T1 → T2(T1先写B,T2后写B,不能交换顺序)W1(B)和R3(B):写-读冲突,依赖边T1 → T3W2(A)和W1(A):写-写冲突,依赖边T2 → T1(T2先写A,T1后写A,不能交换顺序)W2(A)和R3(A):写-读冲突,依赖边T2 → T3W1(A)和R3(A):写-读冲突,依赖边T3 → T1(T3先读A,T1后写A,不能交换顺序)W2(B)和R3(B):写-读冲突,依赖边T3 → T2(T3先读B,T2后写B,不能交换顺序)
现在冲突图中出现了循环,比如 T1 → T2 → T1,这说明调度S无法通过交换非冲突操作转换为任何串行调度,因此它不属于冲突可串行化调度。
内容的提问来源于stack exchange,提问作者M H
相关产品推荐
相关产品推荐

