有多种方法可以测试可序列化性。 可串行化的目标是找到允许事务并发执行而不会相互干扰的非串行调度。
首先我们进行冲突等效测试。这将告诉我们调度是否可序列化。
为此,我们必须定义一些规则(i & j 是 2 个事务,R=Read,W=Write)。
如果等价于:我们不能交换动作顺序:
1. Ri(x), Wi(y) - Conflicts
2. Wi(x), Wj(x) - Conflicts
3. Ri(x), Wj(x) - Conflicts
4. Wi(x), Rj(x) - Conflicts
但这些都是完全有效的:
R1(x), Rj(y) - No conflict (2 reads never conflict)
Ri(x), Wj(y) - No conflict (working on different items)
Wi(x), Rj(y) - No conflict (same as above)
Wi(x), Wj(y) - No conflict (same as above)
所以应用上面的规则我们可以推导出这个(为简单起见使用 excel):
从结果中,我们可以清楚地看到 with 成功推导了一个序列关系(即您上面的时间表,可以拆分为S(T1, T3, T2)。
现在我们有了一个可序列化的时间表和序列时间表,我们现在进行Conflict-Serialazabile 测试:
执行此操作的最简单方法是使用与冲突等效测试相同的规则,查找任何可能发生冲突的组合。
r1(x); r2(z); r1(z); r3(y); r3(y); w1(x); w3(y); r2(y); w2(z); w2(y);
----------------------------------------------------------------------
r1(z) w2(z)
r3(y) w2(y)
w3(y) r2(y)
w3(y) w2(y)
使用上面的规则,我们最终得到了一个类似上面的表(例如,我们知道从一个事务中读取 z,然后从另一个事务中写入 z 会导致冲突(查看规则 3)。
给定表格,从左到右,我们可以创建具有以下条件的优先图:
T1 -> T2
T3 -> T2 (only 1 arrow per combination)
因此我们最终得到一个如下图:
从图中,由于它是非循环的(无循环),我们可以得出结论,调度是可冲突序列化的。此外,因为它也是可序列化的视图(因为每个冲突的时间表也是视图-s)。我们可以测试 view-s 来证明这一点,但它相当复杂。
关于学习本资料的来源,我推荐:
“数据库系统:设计、实施和管理的实用方法:国际版”,作者:Thomas Connolly; Carolyn Begg -(它相当昂贵,所以我建议寻找更便宜的 pdf 副本)
祝你好运!
更新
我开发了a little tool,它将为您完成上述所有工作(包括图表)。使用起来非常简单,我还添加了一些示例。