【问题标题】:How to determine the whether the transaction is conflict-serializable or not?如何确定事务是否可冲突序列化?
【发布时间】:2021-02-25 02:51:07
【问题描述】:

我有以下question

read(T1, x)
read(T2, x)
write(T1, x)
write(T2, x)
commit(T1)
commit(T2)

说明调度是否可冲突序列化、可恢复并避免级联中止?

我这样处理问题:

----------------------
|   T1    |   T2     |
----------------------
| read(x) |          |
----------------------
|         | read(x)  |
----------------------
| write(x)|          |
----------------------
|         | write(x) |
----------------------
| commit  |          |
----------------------
|         | commit   |
----------------------

我想,由于优先图中没有循环(非循环),因此它是可冲突序列化的。还可以通过交换将事务T1 转换为事务T2

----------------------
|   T1    |   T2     |
----------------------
| read(x) |          |
----------------------
| write(x)|          |
----------------------
| commit  |          |
----------------------
|         | read(x)  |
----------------------
|         | write(x) |
----------------------
|         | commit   |
----------------------
  • 可以恢复吗?我认为是的,因为T1 在写入后提交,T2 读取、写入和提交。

  • 它是无级联的吗?我认为没有,因为T1T2 在写完之后没有提交。

  • 是否避免级联中止?我认为是的,因为它是可恢复的。

但是,答案是:

  • 不冲突可序列化

  • 可恢复

  • 避免级联中止

现在,为什么这个冲突是严重的?

  • 答案很可能是T2 read(x) -> T1 write(x) -> T2 write(x) 之间的循环。

  • 如果我是对的,那么为什么调度 3 是可冲突序列化的?

问候

【问题讨论】:

    标签: database conflict-serializability


    【解决方案1】:

    我想,由于优先图中没有循环(非循环),它是可冲突序列化的。

    错误的假设。如果我们绘制优先图:

    日程不是conflict-serializable

    • 可以恢复吗?

      • 是的。 T1 首先写入 X 并首先提交 T1
    • 是无级联的吗?

      • 没有。 T2 不会读取提交的数据。
    • 是级联的吗?

      • 是的。如果出现故障X 可以恢复到原来的值。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2017-07-06
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多