【发布时间】:2013-12-30 01:19:48
【问题描述】:
我的理解是冲突可序列化意味着可序列化。我不确定这如何使它们与众不同。可序列化是否意味着冲突可序列化?
【问题讨论】:
我的理解是冲突可序列化意味着可序列化。我不确定这如何使它们与众不同。可序列化是否意味着冲突可序列化?
【问题讨论】:
冲突可序列化是可序列化的子集,所以仅仅因为调度是冲突可序列化的就意味着它是可序列化的。
参见牛书数据库管理系统第 2 版 Cha19.1.1 P541
每个冲突可序列化调度都是可序列化的。
一个可序列化但不冲突的可序列化调度是
T1 : R(A) W(A) C
T2 : W(A) C
T3 : W(A) C
这不是冲突可序列化的(按优先级图),但等效于可序列化调度
T1 T2 T3
因为 T3 盲目地在两个调度中写入输出。
【讨论】:
冲突可序列化是可序列化的子集。如果一个调度是冲突可序列化的,则暗示该调度是可序列化的。
与仅可序列化相比,确定某些内容是否可冲突序列化在计算上更容易。只需构造一个precedence graph。如果图是非循环的,那么这个调度与图的路径描述的一些串行调度是冲突等价的。
想象一下事务 A B 和 C,都写入同一个页面。 A 写,然后是 B,然后是 C,然后是 A。没有与冲突等效的可序列化调度。 A必须先走,因为B和C在A之后有冲突。但A也必须在最后,因为B和C在A之前有冲突。因此图中的循环。
但是仅仅因为它不是可序列化的冲突并不意味着它不可序列化。例如,如果 A 的最后一次写入与 C 的写入完全相同,那么 ABC 将是一个与原来相同的串行调度,因为最后一次写入并不重要。
【讨论】:
冲突可序列化是视图可序列化的子集。 "调度可以是冲突序列化的,但不是视图序列化的(如盲写)
【讨论】:
简单来说, 假设有一个带有两个事务 T1,T2 的计划(S)。 令 Result1, Result2 为两个变量,其中 Result1 是在运行 T1 再运行 T2 后产生的,即 T1->T2;(串行) Result2 是在运行 T2 再运行 T1 后产生的,即 T2->T1;(串行)
现在假设我们将两个事务的动作交错,我们称它为调度 S,现在如果运行 S 后产生的最终结果等于 Result1 或 Result2,那么我们称之为可序列化。
但是,如果我们可以交换不冲突的动作并生成一个等于的串行调度,其中 T1 先运行然后 T2(T1->T2),或者 T2首先运行,然后是 T1(T2->T1),然后我们称之为冲突序列化。
现在,如果调度是可冲突序列化的,那么它必然是可序列化的,因为可以通过交换非冲突操作将其更改为某种序列顺序。
因此我们可以得出结论,每个可冲突序列化的计划都是可序列化的,但并非所有可序列化计划都是可冲突序列化的。
【讨论】:
Serializability 有两种类型:Conflict 和 View。 Conflict serializable 确定一个调度是否等同于某个串行调度,使冲突操作(R-W 或 W-R 或 W-W)保持与原始调度相同的顺序。
【讨论】: