📜  查看 DBMS 中的可序列化性

📅  最后修改于: 2021-09-09 10:35:00             🧑  作者: Mango

先决条件 – DBMS 中的计划类型
视图可序列化是一个概念,用于计算调度是否是视图可序列化的。如果一个调度表等同于一个串行调度表(其中不可能有事务的交错),则该调度表被称为可查看序列化的。

为什么我们需要使用 View-Serializability ?
可能有一些调度不是 Conflict-Serializable 但仍然给出一致的结果,因为当调度的优先级图包含循环/循环时,冲突可序列化的概念变得有限。在这种情况下,我们无法预测时间表是一致的还是不一致的。根据 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 
 

它的优先级图如下——

现在,我们看到第二张表的优先级图不包含任何循环/循环,这意味着它是冲突可序列化的(相当于串行调度,一致),最终结果与第一张表相同。

注意:在上面的例子中,我们了解到如果一个调度是冲突可序列化的,那么我们可以很容易地预测它会是——

  1. 相当于串行调度,
  2. 持续的,
  3. 还有一个视图可序列化。

但是如果它是非冲突的可序列化(优先图包含循环)呢?在这种情况下,我们无法预测它是否一致和可序列化。正如我们在上面的示例中所看到的尽管包含循环/循环,但 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,所以我们将为调度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’ 是可视图序列化的。