数据库事物之冲突可串行化、优先图、视图等价和视图可串行化

写于考试前。。

冲突(conflict):即在一个 schedule 里面,对同一样事物,一个在写,同时另一个在读或者写,会造成冲突。

冲突可串行化(conflict serializable):一个 schedule能将冲突的操作调节成类似串行化的操作。

优先图判断是否是冲突可串行化:

  1. 先画出每个 transaction(T1 T2 T3…)
  2. 找到所有的 读写操作,按照先后顺序,将                read—>write, write—>read, write—>write 连起来,都是前指向后,这些读写都是不同 transaction之间,相同的 transaction 内部不管,如果是相同路径的线段重复多条,只画一条。
  3. 如果画完了有环,则是非冲突可串行化,就是有冲突,但是不能串行化的

视图等价(view equivalent): 判断两个 schedule 是否是视图等价的,用下面规则:

1. 对同一 data item, 只要是有一个 schedule读了它的初始值,另外一个 schedule 也必须读它的初始值。

2. 对同一data  item,如果在一个 schedule 里,一个操作是读了一个写操作后的值,另一个 schedule 也必须读同样写操作后的值。

3.对同一 data item,如果在一个 schedule 里最后进行了写操作,则另一个 schedule 也要在最后进行同样的写操作。

如果三条规则都满足,才能认为两个 schedule 是视图等价的

视图可串行化

  1. 如果一个schedule 是视图等价于一个串行化 schedule,那么它是视图可串行化的。
  2. 每一个冲突可串行化的 schedule都是视图可串行化的 ,反过来不成立。
  3. 如果视图可串行化不是冲突可串行化,那么一定是因为多了1到多个盲目写操作。
  4. 用 NP-complete 来测试是否是视图可串行化,最主要的是以下几点:
    1. 增加两个虚拟的 transaction,Tbw即在一开始写, Tfr在最后读。
    2. 找出所有的读写,按照先 write 后 read这个顺序把 write 记为 T i, read 记为T j,然后 Ti—>Tj一一连起来,连起来的线上全部标记为0。
    3. 所有的写操作都记为 Tk(除了 Tbw)。
    4. 对于每一条 Ti—>Tj,( 对应写—>读操作的 transcation)
      1. 如果 Ti (写操作)是 Tbw,Tj(读操作) 不是 Tfr,则把那个读操作的 transaction T j—>Tk,上面也是记为0的,如果这里和前面第2条重复了,那也只画一条。
      2. 如果Ti 不是 Tbw,而 Tj 是 Tfr,则创建一条 Tk—>Ti的,也记为0
      3. 如果Ti 不是 Tbw,Tj 不是 Tfr ,则画出 Tk—>Ti和 Tj—>Tk 的,但是都记为1,所有的指向都是 k—>i, j—>k 的只是序号因为条件不同
      4. 画完之后再一条条将1的分开,一个图保留1条含1的线段,直到1线段用完,如果这些图里有一个是没有环的,则它是视图可串行化的



综上所述:如何判断一个 schedule是否是视图可串行化?

1 如果是冲突可串行化,则是,冲突可串行化可用优先图,优先图无环则是冲突可串行化,则是视图可串行化。

2 如果它视图等价于一个可串行化的 schedule,方法上面讲了。

3 如果用 NP-complete 画的图任意一个无环,就是啦。




你可能感兴趣的:(数据库事物之冲突可串行化、优先图、视图等价和视图可串行化)