📜  DBMS可序列化性测试

📅  最后修改于: 2020-12-12 07:33:44             🧑  作者: Mango

可串行性测试

序列化图用于测试计划的可序列化性。

假设有一个计划S。对于S,我们构造一个称为优先级图的图。此图具有一对G =(V,E),其中V包含一组顶点,E包含一组边。顶点集用于包含计划中的所有事务。一组边用于包含所有满足以下三个条件之一的Ti-> Tj边:

  • 如果Ti在Tj执行读取(Q)之前执行写入(Q),则创建节点Ti→Tj。
  • 如果Ti在Tj执行写入(Q)之前执行Ti(读取)(Q),则创建节点Ti→Tj。
  • 如果Ti在Tj执行写(Q)之前执行写(Q),则创建节点Ti→Tj。

  • 如果优先级图包含单个边Ti→Tj,则在执行Tj的第一条指令之前先执行Ti的所有指令。
  • 如果时间表S的优先级图包含一个周期,则S是不可序列化的。如果优先级图没有循环,则S被称为可序列化。

例如:

说明:

读(A):在T1中,没有后续写入A的操作,因此没有新的边
读(B):在T2中,没有后续向B的写操作,因此没有新的沿
读(C):在T3中,没有后续的对C的写操作,因此没有新的边沿
Write(B):随后由T3读取B,因此添加边T2→T3
Write(C): T1随后读取C,因此将边T3→T1相加
Write(A): A随后被T2读取,因此添加边T1→T2
Write(A):在T2中,没有后续读取A,因此没有新的边
Write(C):在T1中,没有后续读取C,因此没有新的边
Write(B):在T3中,没有后续读取B,因此没有新的边

计划S1的优先级图:

计划S1的优先级图包含一个周期,这就是为什么计划S1无法序列化的原因。

说明:

读(A):在T4中,没有后续写入A的操作,因此没有新的边
读(C):在T4中,没有后续的对C的写操作,因此没有新的沿
Write(A):随后由T5读取A,因此添加边T4→T5
读(B):在T5中,没有后续写入B的操作,因此没有新的边
Write(C): T6随后读取C,因此添加边T4→T6
Write(B): A随后被T6读取,因此添加边T5→T6
Write(C):在T6中,没有后续读取C,因此没有新的边
Write(A):在T5中,没有后续读取A,因此没有新的边
Write(B):在T6中,没有后续读取B,因此没有新的边

计划S2的优先级图:

计划S2的优先级图不包含任何循环,这就是为什么ScheduleS2可序列化的原因。