先决条件 – DBMS 中的计划类型
视图可序列化是一个概念,用于计算调度是否是视图可序列化的。如果一个调度表等同于一个串行调度表(其中不可能有事务的交错),则该调度表被称为可查看序列化的。
为什么我们需要使用 View-Serializability ?
可能有一些调度不是 Conflict-Serializable 但仍然给出一致的结果,因为当调度的 Precedence Graph包含循环/循环时,Conflict-Serializability 的概念变得有限。在这种情况下,我们无法预测时间表是一致的还是不一致的。根据 Conflict-Serializability 的概念,我们可以说调度是 Conflict-Serializable(意味着串行和一致)如果其对应的优先级图没有任何循环/循环。
但是,如果一个调度的优先级图包含一个循环/循环并且给出一致的结果/准确的结果作为一个冲突可序列化调度给出呢?
因此,为了解决这种情况,我们引入了View-Serializability的概念,因为我们不想将可序列化的概念仅限于 Conflict-Serializability。
示例:首先使用 Schedule S 1了解视图序列化能力:
T1 | T2 | T3 |
---|---|---|
a=100 read(a) |
||
a=a-40 write(a) //60 |
||
a=a-40 write(a) //20 |
||
a=a-20 write(a) //0 |
所以,它的冲突优先级图如下——
上图包含循环/循环,这意味着它不是冲突可序列化的,但这并不意味着它不能与串行调度保持一致和等效,它可能是也可能不是。
LookSchedule S’ 1 :
在上面的例子中,如果我们在一些事务的操作之间进行交换,那么我们的表将如下所示:
T1 | T2 | T3 |
---|---|---|
a=100 read(a) //100 |
||
a=a-40 write(a) //60 |
||
a=a-40 write(a) //20 |
||
a=a-20 write(a) //0 |
它的优先级图如下——
现在,我们看到第二张表的优先级图不包含任何循环/循环,这意味着它是冲突可序列化的(相当于串行调度,一致),最终结果与第一张表相同。
注意:在上面的例子中,我们了解到如果一个调度是冲突可序列化的,那么我们可以很容易地预测它会是——
- 相当于串行调度,
- 持续的,
- 还有一个视图可序列化。
但是如果它是非冲突的可序列化(优先图包含循环)呢?在这种情况下,我们无法预测它是否一致和可序列化。正如我们在上面的例子中看到的,尽管包含循环/循环,但 Schedule S 1的优先级图给出了一致的结果,相当于Schedule S’ 1 的可序列化结果。因此,为了解决 Conflict-Serializability 概念的局限性,View-Serializability 方法出现了。
检查计划的视图可序列化的方法 –
方法一:
如果同意以下条件,则两个时间表S 1和 S 2被称为视图等效 – 转到链接:点编号 3 。
方法2:
首先,检查给定的调度是 Non-Conflict Serializable 还是 Conflict-Serializable –
- 如果给定的调度是冲突可序列化的(意味着它的优先级图不包含任何循环/循环),那么给定的调度必须是一个可序列化的视图。停止并提交您的最终答案。
- 如果给定的调度是非冲突可序列化的,那么它可能是也可能不是视图可序列化的。我们无法仅通过使用冲突可串行化的概念来预测它,因此我们需要查看以下案例。
执行上述步骤后,如果您发现提供的时间表不冲突,则需要执行以下步骤 –
盲写:执行写操作(更新),不进行读操作,这种写操作称为盲写。
- 如果不存在盲写,则调度必须是非视图可序列化调度。停止并提交您的最终答案。
- 如果存在任何盲写,那么在这种情况下,调度可能是也可能不是视图可序列化的。所以我们需要看看下面的案例。因为,如果它不包含任何盲写,我们可以肯定地说调度不会是 View-Serializable。
- 如果以上两个条件都不起作用{表示我们已经尝试了以上两个条件,那么我们到了这一步}。然后,使用这些依赖关系绘制优先级图。如果图中不存在循环/循环,则调度将是一个视图可序列化,否则不是。
问题:证明给定的调度是否是视图可序列化的?
S' : read1(A), write2(A), read3(A), write1(A), write3(A)
解决方案:首先,我们将制作一个表格,以便更好地理解时间表 S’-
T1 | T2 | T3 |
---|---|---|
read(a) | ||
write(a) | ||
read(a) | ||
write(a) | ||
write(a) |
- 首先我们检查它是否是Conflict-Serializable,因为如果它是Conflict-Serializable那么它也将是View-Serializable,所以我们将为schedule S’制作一个优先级图。
- 在这里,我们将检查 Schedule s’ 是否包含任何盲写。我们发现调度 s’ 在事务 T2 中包含一个盲写 write2(a)。因此,调度 S’ 可能是也可能不是 View-Serializable。所以我们将看看另一种方法。因为,如果它不包含任何 Blind-write,我们可以肯定地说调度不会是 View-Serializable。
- 现在,我们将绘制一个与优先级图不同的依赖图。
其依赖关系图将如下所示 –
- 事务T 1首先读取 data_item “a” 和事务T 2 首先更新(写) “a”。
- 因此,事务T 1必须在T 2之前执行。
- 这样,我们就得到了图中的依赖关系(T 1 → T 2 ) 。
- 并且,对“a”的最终更新(写入)由事务T 3 进行。
- 因此,事务T 3必须在所有其他事务(T 1 ,T 2 )之后执行。
- 因此,我们得到图中的依赖关系(T 1 , T 2 ) → T 3 。
由于依赖图中没有循环/循环,调度 s’ 是可视图序列化的。