查看Serializable和冲突可序列化

时间:2015-10-05 05:36:35

标签: transactions

我正在阅读有关交易时间表中的可序列化的内容,因此请阅读conflict serializableview serializable时间表。

现在因为冲突序列化比视图序列化更严格,很明显会有可视化序列化但不能冲突序列化的计划。在本书中我读了以下内容:

  

盲写在任何视图可序列化的计划中都会出现,但不会出现   可以发生冲突。

我一直试图提出上述陈述的证明,但却无法做到。

我的问题是:是否有上述陈述的正式证据?

3 个答案:

答案 0 :(得分:0)

盲写意味着事务在不读取数据库变量的情况下写入数据库。

这意味着,如果我们知道数据库变量名称。如果我们使用带有某些值的变量进行编写。

交易如下,即盲目写作。

实施例: -

Transaction T1                           Transaction T2

  Write(X)
                                            Write(X)
  Write(Y)
                                            Write(Y)

在上面的例子中,我们没有读取变量X,但我们正在编写X.

如果我们在不使用旧值的情况下编写数据库,则没有冲突可串行化。在这里,我们必须替换数据库中的旧值。盲写在两个事务中使用相同的数据库变量名完成。那时它也是可序列化的。

答案 1 :(得分:0)

只是一个草图证明,因为我不太熟悉他们使用的语言&不确定填写细节的好方法......

假设我们有一个View Serializable Schedule G,它不是Conflict Serializable。考虑对G中相同对象的一系列冲突动作,它必须按定义存在。

考虑圆圈中的写入动作,表示为W(A)。

假设他们都没有盲目写作。

考虑圈中必须存在的最早的W(A),WLG从T1表示它,并将此写作表示为W1(A)

假设此圆圈仅存在1 W(A)。然后,时间表不是可视序列化的,因为这意味着存在一个时间表,当前W(A)之前的R(A)和当前W(A)之后的R(A)相反。

然后考虑一些W(A)来自T1之后将存在,表示在W1(A)为S之后具有这些W(A)的交易集。

我们知道S!= {T1},因为如果是这样,那么时间表再也不是可序列化的,因为它意味着有一个T3包含在两个W(A)之间发生的R(A)。

然后考虑一组非空的S - T1。

案例1:假设在这个冲突圈中,A之前没有其他行动在W1(A)之前。这意味着T1在W1(A)之后对A进行一些动作。 子例1:冲突圈中T1的动作是R(A) 然后它不是可序列化的,因为在串行调度中R(A)读取了W1(A)所写的内容。 子例2:冲突圆中的T1的动作是W(A),表示为W2(A)。 同样,为了使其可视化可序列化,对于所有事务,在W1(A)和W2(A)之间不应存在R(A)。所以冲突至少应该涉及W1(A)和W2(A)之间的一些W(A),这是S-T1中的一个交易。它有一个R(A)在其W(A)之前,并且根据要求它将在W1(A)之前

案例2:假设在这个冲突圈中,有一个早于W1(A)的行动 根据定义,它必须是R(A)并且具有这个早期R(A)的事务应该在S-T1的一部分中,否则此R(A)之后的动作将是另一个R(A)冲突视图串行化。

组合2种情况:在S-T1中存在一个事务,其在T1的W1(A)之前具有R(A),在T1的W1(A)之后具有W(A)。将此交易表示为T2,将两个动作分别表示为T2(A)和W2(A)。

在W1(A)之前考虑T1中的R1(A)。然后T1不能被视为可序列化为T2,因为在视图串行调度中,R1(A)读取W2(A)或R2(A)读取W1(A)将发生,但两者都不会发生。相反。

然后我们的假设是错误的,其中一些是盲写。

答案 2 :(得分:-1)

以下示例既是可序列化的视图,也是可序列化的schedule

schedule

现在,如果我们想将其转换为视图可序列化但不可冲突序列化的计划,我们必须执行其中一项更改:

  1. W(B)
  2. 中将W(A)更改为T1
  3. R(A)
  4. 中将W(A)更改为T2

    在第一种情况下,计划不会冲突序列化,也不会被视图序列化

    因此,第二种情况确保我们的任务导致盲写。 因此盲目写入是必要的。

    盲目写入对于满足视图可串行性和冲突序列化的条件是必要的