先决条件:冲突可串行化
优先级图或序列化图通常用于测试计划的冲突可序列化性。
它是一个有向图 (V, E),由一组节点 V = {T 1 , T 2 , T 3 ……….T n } 和一组有向边 E = {e 1 , e 2 , e 3 ………………e m }。
该图包含每个交易 T i 的一个节点。边 e i的形式为 T j –> T k ,其中 T j是 e i的起始节点,T k是 e i的结束节点。边e i被节点T J之间构建至T k如果在T J的操作中的一个出现在时间表T中ķ一些冲突的操作之前。
算法可以写成:
- 为计划中的每个参与事务在图中创建一个节点 T。
- 对于冲突操作 read_item(X) 和 write_item(X) – 如果事务 T j在 T i执行 write_item (X) 之后执行 read_item (X),则在图中绘制从 T i到 T j 的边。
- 对于冲突操作 write_item(X) 和 read_item(X) – 如果事务 T j在 T i执行 read_item (X) 之后执行 write_item (X),则在图中绘制一条从 T i到 T j 的边。
- 对于冲突操作 write_item(X) 和 write_item(X) – 如果事务 T j在 T i执行 write_item (X) 之后执行 write_item (X),则在图中绘制一条从 T i到 T j 的边。
- 如果优先级图中没有循环,则 Schedule S 是可序列化的。
如果优先级图中没有环,则意味着我们可以构造一个串行调度 S’,它与调度 S 冲突等价。
串行调度S’可以通过非循环优先图的拓扑排序找到。此类计划可以超过 1 个。
例如,
考虑调度 S :
S : r1(x) r1(y) w2(x) w1(x) r2(y)
创建优先级图:
- 创建两个节点,分别对应事务 T 1和 T 2 。
- 对于冲突对 r1(x) w2(x),其中 r1(x) 发生在 w2(x) 之前,绘制从 T 1到 T 2 的边。
- 对于冲突对 w2(x) w1(x),其中 w2(x) 发生在 w1(x) 之前,绘制从 T 2到 T 1 的边。
由于图是循环的,我们可以得出结论,它不是冲突可序列化到任何调度串行调度。
让我们尝试使用拓扑排序从该图中推断串行调度。
边 T 1 –>T 2表明在线性排序中 T 1应该在 T 2 之前。
边 T 2 –> T 1表明在线性排序中 T 2应该在 T 1 之前。
所以,我们无法预测任何特定的顺序(当图是循环时)。因此,无法从该图中获得串行调度。考虑另一个调度 S1 :
S1: r1(x) r3(y) w1(x) w2(y) r3(x) w2(x)
这个时间表的图表是:
由于图是非循环的,调度是冲突可序列化的。在这个图上执行拓扑排序会给我们一个可能的串行调度,它与调度 S1 冲突等效。
在拓扑排序中,我们首先选择入度为 0 的节点,即 T1。紧随其后的是 T3 和 T2。
因此, S1 是冲突可串行化的,因为它与串行调度 T1 T3 T2等价。
资料来源:操作系统书籍、Silberschatz、Galvin 和 Gagne