如并发控制中所述,串行调度具有较少的资源利用率和低吞吐量。为了改进它,两个或多个事务同时运行。但是事务的并发可能会导致数据库的不一致。为了避免这种情况,我们需要检查这些并发调度是否可序列化。
冲突可序列化:如果调度可以通过交换非冲突操作转换为串行调度,则称为冲突可序列化。
冲突操作:如果所有条件都满足,则称两个操作是冲突的:
- 它们属于不同的交易
- 它们对相同的数据项进行操作
- 其中至少一个是写操作
例子: –
- 冲突操作对 (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 是冲突可序列化的。
相关文章:
查看可序列化性
用于测试冲突可串行化的优先图