📜  DBMS 中的冲突可串行化

📅  最后修改于: 2021-09-08 15:30:24             🧑  作者: Mango

如并发控制中所述,串行调度具有较少的资源利用率和低吞吐量。为了改进它,两个或多个事务同时运行。但是事务的并发可能会导致数据库的不一致。为了避免这种情况,我们需要检查这些并发调度是否可序列化。

冲突可序列化:如果调度可以通过交换非冲突操作转换为串行调度,则称为冲突可序列化。

冲突操作:如果所有条件都满足,则称两个操作是冲突的:

  • 它们属于不同的交易
  • 它们对相同的数据项进行操作
  • 其中至少一个是写操作

例子: –

  • 冲突操作对 (R 1 (A), W 2 (A)) 因为它们属于同一数据项 A 上的两个不同事务,其中之一是写操作。
  • 同样, (W 1 (A), W 2 (A)) 和 (W 1 (A), R 2 (A)) 对也存在冲突
  • 另一方面, (R 1 (A), W 2 (B)) 对是非冲突的,因为它们对不同的数据项进行操作。
  • 类似地, ((W 1 (A), W 2 (B)) 对是非冲突的。

考虑以下时间表:

S1: R1(A), W1(A), R2(A), W2(A), R1(B), W1(B), R2(B), W2(B)

如果 O i和 O j是事务中的两个操作,并且 O i < O j (O i在 O j之前执行),则调度中也将遵循相同的顺序。使用这个属性,我们可以得到调度 S1 的两个事务:

T1: R1(A), W1(A), R1(B), W1(B)
T2: R2(A), W2(A), R2(B), W2(B)

可能的串行时间表是:T1->T2 或 T2->T1

->在 S1 中交换非冲突操作s R 2 (A) 和 R 1 (B),调度变为,

S11: R1(A), W1(A), R1(B), W2(A), R2(A), W1(B), R2(B), W2(B)

-> 同样,在 S11 中交换非冲突操作W 2 (A) 和 W 1 (B),调度变为,

S12: R1(A), W1(A), R1(B), W1(B), R2(A), W2(A), R2(B), W2(B)

S12 是一个串行调度,其中 T1 的所有操作都在开始 T2 的任何操作之前执行。由于 S 已通过交换 S1 的非冲突操作转换为串行调度 S12,因此 S1 是可冲突串行化的。

让我们再看一个时间表:

S2: R2(A), W2(A), R1(A), W1(A), R1(B), W1(B), R2(B), W2(B)

两笔交易将是:

T1: R1(A), W1(A), R1(B), W1(B)
T2: R2(A), W2(A), R2(B), W2(B)

可能的串行时间表是:T1->T2 或 T2->T1

原计划是:

S2: R2(A), W2(A), R1(A), W1(A), R1(B), W1(B), R2(B), W2(B)

交换 S2 中的非冲突操作 R 1 (A) 和 R 2 (B),调度变为,

S21: R2(A), W2(A), R2(B), W1(A), R1(B), W1(B), R1(A), W2(B)

类似地,在 S21 中交换非冲突操作 W 1 (A) 和 W 2 (B),调度变为,

S22: R2(A), W2(A), R2(B), W2(B), R1(B), W1(B), R1(A), W1(A)

在调度S22中,首先执行T2的所有操作,但T1的操作没有顺序(顺序应该是R 1 (A)、W 1 (A)、R 1 (B)、W 1 (B))。所以 S2 不是冲突可序列化的。

冲突等价:当一个调度可以通过交换非冲突操作转换为另一个调度时,就说两个调度是冲突等价的。在上面讨论的示例中,S11 与 S1 是冲突等价的(S1 可以通过交换非冲突操作转换为 S11)。同理,S11 等价于 S12 的冲突等。

注 1:虽然 S2 不是冲突可序列化的,但它仍然是等效于 S21 和 S21 的冲突,因为 S2 可以通过交换非冲突操作转换为 S21 和 S22。

注2:冲突可串行化的调度总是冲突等价于串行调度之一。上面讨论的 S1 调度(它是冲突可序列化的)等价于串行调度(T1->T2)。

问题:考虑以下涉及两个事务的时间表。以下哪一项陈述是正确的?

S1: R 1 (X) R 1 (Y) R 2 (X) R 2 (Y) W 2 (Y) W 1 (X)
S2: R 1 (X) R 2 (X) R 2 (Y) W 2 (Y) R 1 (Y) W 1 (X)

  • S1 和 S2 都是冲突可序列化的
  • 只有 S1 是冲突可序列化的
  • 只有 S2 是冲突可序列化的
  • 没有任何

[门 2007]

解决方案:给定时间表的两个事务是:

T1: R1(X) R1(Y) W1(X)
 T2: R2(X) R2(Y) W2(Y)

让我们首先检查 S1 的可序列化性:

S1: R1(X) R1(Y) R2(X) R2(Y) W2(Y) W1(X)

要将其转换为串行调度,我们必须交换非冲突操作,使 S1 等效于串行调度 T1->T2 或 T2->T1。在这种情况下,要将其转换为串行调度,我们必须交换 R 2 (X) 和 W 1 (X) 但它们是冲突的。所以 S1 不能转换为串行调度。

现在,让我们检查 S2 的可序列化性:

S2: R1(X) R2(X) R2(Y) W2(Y) R1(Y) W1(X)

交换 S2 的非冲突操作 R 1 (X) 和 R 2 (X),我们得到

S2’: R2(X) R1(X) R2(Y) W2(Y) R1(Y) W1(X)

同样,交换 S2′ 的非冲突操作 R 1 (X) 和 R 2 (Y),我们得到

S2’’: R2(X) R2(Y) R1(X) W2(Y) R1(Y) W1(X)

同样,交换 S2” 的非冲突操作 R 1 (X) 和 W 2 (Y),我们得到

S2’’’: R2(X) R2(Y) W2(Y) R1(X) R1(Y) W1(X)

这相当于串行调度 T2->T1。

所以,正确的选项是 C 。只有 S2 是冲突可序列化的。

相关文章:
查看可序列化性
用于测试冲突可串行化的优先图