您的位置:首页 > 数据库

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

2016-01-17 11:21 357 查看
写于考试前。。

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

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

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

先画出每个 transaction(T1 T2 T3…)
找到所有的 读写操作,按照先后顺序,将                read—>write, write—>read, write—>write 连起来,都是前指向后,这些读写都是不同 transaction之间,相同的 transaction 内部不管,如果是相同路径的线段重复多条,只画一条。
如果画完了有环,则是非冲突可串行化,就是有冲突,但是不能串行化的。
视图等价(view equivalent): 判断两个 schedule 是否是视图等价的,用下面规则:

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

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

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

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

视图可串行化:

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

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

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

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

3 如果用 NP-complete 画的图任意一个无环,就是啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息