📜  用于在 DBMS 中测试冲突可串行性的优先图

📅  最后修改于: 2021-09-08 16:20:49             🧑  作者: Mango

先决条件:冲突可串行化

优先级图序列化图通常用于测试计划的冲突可序列化性。
它是一个有向图 (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中ķ一些冲突的操作之前。

算法可以写成:

  1. 为计划中的每个参与事务在图中创建一个节点 T。
  2. 对于冲突操作 read_item(X) 和 write_item(X) – 如果事务 T j在 T i执行 write_item (X) 之后执行 read_item (X),则在图中绘制从 T i到 T j 的边。
  3. 对于冲突操作 write_item(X) 和 read_item(X) – 如果事务 T j在 T i执行 read_item (X) 之后执行 write_item (X),则在图中绘制一条从 T i到 T j 的边。
  4. 对于冲突操作 write_item(X) 和 write_item(X) – 如果事务 T j在 T i执行 write_item (X) 之后执行 write_item (X),则在图中绘制一条从 T i到 T j 的边。
  5. 如果优先级图中没有循环,则 Schedule S 是可序列化的

如果优先级图中没有环,则意味着我们可以构造一个串行调度 S’,它与调度 S 冲突等价。
串行调度S’可以通过非循环优先图的拓扑排序找到。此类计划可以超过 1 个。

例如,
考虑调度 S :

S : r1(x) r1(y) w2(x) w1(x) r2(y) 

创建优先级图:

  1. 创建两个节点,分别对应事务 T 1和 T 2
    2
  2. 对于冲突对 r1(x) w2(x),其中 r1(x) 发生在 w2(x) 之前,绘制从 T 1到 T 2 的边
    3
  3. 对于冲突对 w2(x) w1(x),其中 w2(x) 发生在 w1(x) 之前,绘制从 T 2到 T 1 的边

    4

由于图是循环的,我们可以得出结论,它不是冲突可序列化到任何调度串行调度。
让我们尝试使用拓扑排序从该图中推断串行调度。
边 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)

这个时间表的图表是:

22

由于图是非循环的,调度是冲突可序列化的。在这个图上执行拓扑排序会给我们一个可能的串行调度,它与调度 S1 冲突等效。
在拓扑排序中,我们首先选择入度为 0 的节点,即 T1。紧随其后的是 T3 和 T2。
因此, S1 是冲突可串行化的,因为它与串行调度 T1 T3 T2等价。

资料来源:操作系统书籍、Silberschatz、Galvin 和 Gagne