视图可串行化

2025年6月17日 | 阅读5分钟

引言

数据库系统中,保持数据的一致性是至关重要的,尤其是在并发事务的情况下。

视图可串行性确保了并发执行的多个事务的结果与一个有效的顺序执行顺序相匹配。它防止了冲突,并保持了数据库的完整性,从而在多事务环境中防止了不一致。

DBMS View Serializability

DBMS中,视图可串行性主要是一种有效用于确定给定事务调度是否像串行调度一样有效地保持数据库完整性的方法。

串行调度主要涉及顺序执行事务,每个事务在下一个事务开始之前完成。这种方法保证了数据库的一致性和安全性。然而,在性能至关重要的实际系统中,事务通常是并发运行的,这会导致非串行调度,从而引入更多的复杂性。

尽管如此,非串行调度的问題在于,如果控制不当,它们会使数据库处于不一致的状态。这是因为来自不同事务的操作可能会以不可预测的方式相互干扰。为了防止这种情况,我们需要检查一个非串行调度是否与某个串行调度**视图等价**。如果它是,我们就说它是**视图可串行**的。视图等价意味着非串行调度通常产生与串行调度相同的结果,保持相同的读写操作,并反映相同的事务依赖关系。如果所有条件都满足,该调度就被认为是安全的,数据库将保持一致。

一些重要点

  • 如果一个调度与一个串行调度视图等价,那么它就是视图可串行的。
  • 如果一个调度是冲突可串行的,那么它也是视图可串行的。
  • 视图可串行但非冲突可串行的调度包含盲写。

语法

简而言之,DBMS中的**视图可串行性**被认为是检查一个多事务运行的调度是否与某些串行调度(即事务一个接一个执行且没有重叠的调度)表现相同的检查方法。其思想是确保即使在并发执行事务时,结果仍然与串行执行时发生的情况一致。

DBMS View Serializability

然而,我们必须检查几个关键规则来测试两个调度是否**等价**。假设我们要比较两个调度 Y1 和 Y2。只有当这两个调度都有效满足以下所有条件时,它们才被认为是视图等价的。

  • 初始读:两个调度中任何数据项的第一次读操作都必须来自同一个事务。例如,如果在调度 Y1 中,事务 T1 首先读取数据项 Z,那么在调度 Y2 中也必须发生这种情况。执行初始读的事务在两个调度中也必须保持一致。
  • 理解初始读:需要明确的是,初始读是指在调度中对数据项的**第一次读**。一个数据项可能在调度中被读取多次,但第一次读取它被称为初始读。这主要确保了两个调度从同一数据点开始读取。
  • 最终写:每个数据项的最后一次写操作也必须来自两个调度中的同一个事务。所以,如果在 Y1 中事务 T2 是最后一个写入数据项 Z 的事务,那么在 Y2 中,T2 也必须是最后一个写入 Z 的事务。这保证了数据库中的最终值保持一致。
  • 读写(更新读):如果一个调度中的事务读取了由另一个事务更新的值,那么在另一个调度中也必须发生相同的情况。例如,如果在 Y1 中 T1 在 T2 写入 Z 后读取 Z,那么在 Y2 中也必须有效地保留相同的顺序。

视图等价

如果两个调度 S1 和 S2 满足以下条件,则称它们视图等价:

1. 初始读

两个调度的初始读必须相同。假设有两个调度 S1 和 S2。在调度 S1 中,如果事务 T1 读取了数据项 A,那么在 S2 中,事务 T1 也应该读取 A。


DBMS View Serializability

上述两个调度是视图等价的,因为 S1 中的初始读操作由 T1 完成,在 S2 中也由 T1 完成。

2. 更新读

在调度 S1 中,如果 Ti 读取了由 Tj 更新的 A,那么在 S2 中,Ti 也应该读取由 Tj 更新的 A。


DBMS View Serializability

上述两个调度不视图等价,因为在 S1 中,T3 读取了由 T2 更新的 A,而在 S2 中,T3 读取了由 T1 更新的 A。

3. 最终写

最终写在两个调度之间必须相同。在调度 S1 中,如果事务 T1 最后更新了 A,那么在 S2 中,最后写操作也应该由 T1 完成。


DBMS View Serializability

上述两个调度视图等价,因为 S1 中的最终写操作由 T3 完成,在 S2 中,最终写操作也由 T3 完成。

示例


DBMS View Serializability

调度 S

有 3 个事务,总共可能的调度数量

以第一个调度 S1 为例


DBMS View Serializability

调度 S1

步骤 1:数据项的最终更新

在 S 和 S1 这两个调度中,除了初始读之外没有其他读操作,因此我们不需要检查该条件。

步骤 2:初始读

S 中的初始读操作由 T1 完成,在 S1 中也由 T1 完成。

步骤 3:最终写

S 中的最终写操作由 T3 完成,在 S1 中也由 T3 完成。因此,S 和 S1 是视图等价的。

第一个调度 S1 满足所有三个条件,因此我们不需要检查另一个调度。

因此,视图等价的串行调度是

常见问题解答

DBMS 中使用视图可串行性的一些常见问题如下:

问题 1:列出在 DBMS 中使用视图可串行性的主要目标。

答案:视图可串行性的主要目标是确保并发事务的最终结果是正确和一致的,就像它们是顺序执行一样。它还保持了数据库的完整性,同时避免了严格串行执行带来的性能损失。

问题 2:视图可串行性与冲突可串行性有何不同?

答案:两者都旨在确保正确的事务行为,但它们的方法不同。 冲突可串行性侧重于冲突操作的顺序,例如对同一数据的读写操作。相比之下,视图可串行性检查事务是否产生相同的结果并遵循相同的读写模式,而不考虑操作顺序。

问题 3:为什么视图可串行性比冲突可串行性更难测试?

答案:视图可串行性需要对读写序列进行全面分析,以确保初始读、更新和最终写在调度之间匹配。与可以使用图形检查的冲突可串行性不同,此方法涉及更复杂的比较,使其在验证时计算量更大。