DBMS 查看可串行化,前面我们学习了冲突可串行化。在本文中,我们将讨论另一种可串行化,即 查看可串行化 。
什么是查看可串行化?
查看可串行化是一个查找给定调度视图是否可串行化的过程。
要检查给定的调度是否可视化串行化,我们需要检查给定的调度是否对其序列调度 查看等价。让我们举个例子来理解我的意思。
给定调度:
T1 T2
----- ------
R(X)
W(X)
R(X)
W(X)
R(Y)
W(Y)
R(Y)
W(Y)
以上给定调度的串行调度:
我们知道在串行调度中,只有在当前运行的事务完成时才会启动事务。所以上面给出的调度的连续调度如下所示:
T1 T2
----- ------
R(X)
W(X)
R(Y)
W(Y)
R(X)
W(X)
R(Y)
W(Y)
如果我们能够证明给定的调度对其连续调度 查看等价,那么给定的调度称为视图可串行。
为什么我们需要查看可串行化?
我们知道,串行调度永远不会使数据库处于不一致状态,因为没有并发事务执行。但是,非串行调度可能会使数据库处于不一致状态,因为有多个事务同时运行。通过检查给定的非串行调度是否可视化串行化,我们确保它是一致的调度。
您可能想知道不是检查非串行调度是否可串行化,我们不能一直有串行调度吗?答案是否定的,因为事务的并发执行充分利用了系统资源,并且与串行调度相比要快得多。
查看等效
让我们学习如何检查两个调度是否相同。
如果它们满足以下所有条件,则称两个调度T1
和T2
是等效视图:
- 初始读取:事务中每个数据项的初始读取必须在两个调度中都匹配。例如,如果事务
T1
在调度S1
中的事务T2
之前读取数据项X
,则在调度S2
中,T1
应该在T2
之前读取X
。 - 读取与初始读取:您可能会对术语初始读取感到困惑。这里初始读取意味着对数据项的第一次读取操作,例如,数据项
X
可以在调度中多次读取,但是对X
的第一次读取操作称为初始读取。一旦我们在同一篇文章的下一部分中得到示例,这将更加清晰。 -
最终写入:每个数据项的最终写操作必须在两个调度中都匹配。例如,数据项
X
最后由事务T1
在调度S1
中写入,然后在S2
中,对X
的最后一次写操作应该由事务T1
执行。 -
更新读取:如果在调度
S1
中,事务T1
正在读取由T2
更新的数据项,则在调度S2
中,T1
应该在相同数据项上的T2
写操作之后读取该值。例如,在调度S1
中,T1
在X
上执行写入操作后对X
执行读取操作,然后在S2
中,T1
在T2
执行写入操作后读取X
。
查看可串行
如果调度视图等同于其序列调度,那么给定的调度称为查看可串行。让我们举个例子。
看可串行化示例
让我们检查一下可串行化的三个条件:
初始读取
在调度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
是视图可串行化调度。