数据库事物之冲突可串行化、优先图、视图等价和视图可串行化
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 画的图任意一个无环,就是啦。
冲突(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 画的图任意一个无环,就是啦。
相关文章推荐
- Java中的事务——JDBC事务和JTA事务
- 数据库事物特性和隔离级别
- 数据库只读事物和读写事物理解
- 数据库操作
- 在线学习SQL语句?没问题~~
- Mycat学习笔记 第二篇. MySql 读写分离与日志分析——主从多结点
- Mysql 数据类型--课程笔记
- MongoDB写关注
- mysql安装教程
- GreenPlumn数据库体系结构
- Mac下使用MySQL
- SQL高级查询
- mysql安装配置
- 删除指定时间段分区的SQL
- [数据库] SQL语句select简单记录总结
- 使用SQLAlchemy时数据库连接池的问题
- Redis上踩过的一些坑-美团
- MongoDB 基本操作
- MongoDB 命令
- MySQL 常用语法总结