多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# DBMS 查看可串行化 > 原文: [https://beginnersbook.com/2018/12/dbms-view-serializability/](https://beginnersbook.com/2018/12/dbms-view-serializability/) 在上一个教程中,我们学习了[冲突可串行化](https://beginnersbook.com/2018/12/dbms-conflict-serializability/)。在本文中,我们将讨论另一种可串行化,即 **查看可串行化** 。 ## 什么是查看可串行化? 查看可串行化是一个查找给定[调度](https://beginnersbook.com/2018/12/dbms-schedules/)视图是否可串行化的过程。 要检查给定的调度是否可视化串行化,我们需要检查给定的调度是否对其序列调度 **查看等价**。让我们举个例子来理解我的意思。 **给定调度:** ``` T1 T2 ----- ------ R(X) W(X) R(X) W(X) R(Y) W(Y) R(Y) W(Y) ``` **以上给定调度的串行调度:** 我们知道在[串行调度](https://beginnersbook.com/2018/12/dbms-schedules/)中,只有在当前运行的事务完成时才会启动事务。所以上面给出的调度的连续调度如下所示: ``` T1 T2 ----- ------ R(X) W(X) R(Y) W(Y) R(X) W(X) R(Y) W(Y) ``` 如果我们能够证明给定的调度对其连续调度 **查看等价**,那么给定的调度称为**视图可串行**。 ## 为什么我们需要查看可串行化? 我们知道,串行调度永远不会使数据库处于不一致状态,因为没有并发事务执行。但是,非串行调度可能会使数据库处于不一致状态,因为有多个事务同时运行。通过检查给定的非串行调度是否可视化串行化,我们确保它是一致的调度。 您可能想知道不是检查非串行调度是否可串行化,我们不能一直有串行调度吗?答案是否定的,因为事务的并发执行充分利用了系统资源,并且与串行调度相比要快得多。 ## 查看等效 让我们学习如何检查两个调度是否相同。 如果它们满足以下所有条件,则称两个调度`T1`和`T2`是等效视图: 1. **初始读取:**事务中每个数据项的初始读取必须在两个调度中都匹配。例如,如果事务`T1`在调度`S1`中的事务`T2`之前读取数据项`X`,则在调度`S2`中,`T1`应该在`T2`之前读取`X`。 **读取与初始读取:**您可能会对术语初始读取感到困惑。这里初始读取意味着对数据项的第一次读取操作,例如,数据项`X`可以在调度中多次读取,但是对`X`的第一次读取操作称为初始读取。一旦我们在同一篇文章的下一部分中得到示例,这将更加清晰。 2. **最终写入:**每个数据项的最终写操作必须在两个调度中都匹配。例如,数据项`X`最后由事务`T1`在调度`S1`中写入,然后在`S2`中,对`X`的最后一次写操作应该由事务`T1`执行。 3. **更新读取:**如果在调度`S1`中,事务`T1`正在读取由`T2`更新的数据项,则在调度`S2`中,`T1`应该在相同数据项上的`T2`写操作之后读取该值。例如,在调度`S1`中,`T1`在`X`上执行写入操作后对`X`执行读取操作,然后在 `S2`中,`T1`在`T2`执行写入操作后读取`X`。 ## 查看可串行 如果调度视图等同于其序列调度,那么给定的调度称为查看可串行。让我们举个例子。 ### 查看可串行化示例 ![DBMS View Serializability](https://img.kancloud.cn/79/c0/79c0b5647fccafaae65fcb9e76a6ec78_600x300.jpg) 让我们检查一下可串行化的三个条件: #### 初始读取 在调度`S1`中,事务`T1`首先读取数据项`X`.在`S2`中,事务`T1`首先读取数据项`X`. 让我们检查`Y`.在调度`S1`中,事务`T1`首先读取数据项`Y`.在`S2`中,`Y`上的第一次读操作由`T1`执行。 我们检查了数据项`X`和在`S1`和`S1`中满足`Y`和**初始读取**条件。 #### 最终写入 在调度`S1`中,`X`上的最终写操作由事务`T2`完成。在`S2`中,事务`T2`也在`X`上执行最终写入。 让我们检查`Y`.在调度`S1`中,`Y`上的最终写操作由事务`T2`完成。在调度`S2`中,`Y`上的最终写入由`T2`完成。 我们检查了数据项`X`和`Y`,在`S1`和`S2`中,**最终写入**条件得到满足。 #### 更新读取 在`S1`中,事务 T2 读取由 T1 写入的 X 的值。在 S2 中,相同的事务 T2 在 T1 写入之后读取 X. 在`S1`中,事务`T2`读取由`T1`写入的`Y`的值。在`S2`中,相同的事务`T2`在`T1`更新之后读取`Y`的值。 两个调度也满足更新读取条件。 **结果:**由于在该示例中满足检查两个调度是否是视图等效的所有三个条件,这意味着`S1`和`S2`是视图等效的。而且,正如我们所知,调度`S2`是`S1`的连续调度,因此我们可以说调度`S1`是视图可串行化调度。