【问题标题】:When a transaction is rolled back in timestamp ordering protocol why is it given a new timestamp?当事务在时间戳排序协议中回滚时,为什么要给它一个新的时间戳?
【发布时间】:2011-05-26 09:34:31
【问题描述】:

当一个事务在时间戳排序协议中回滚时,为什么要给它一个新的时间戳? 为什么我们不保留旧的时间戳?

【问题讨论】:

  • 这就是我得到问题的方式。
  • 请编辑您的问题以提供更多详细信息,以解释您需要解释的要点。如果您不准备花费足够的精力正确地构建问题,我们为什么要努力回答您的问题?
  • 如果您的专业领域涵盖所询问的主题,那么这个问题实际上非常清楚。如果你不了解时间戳排序数据库并发协议,那它就像泥巴一样晦涩难懂,没错,但是关于 C# 和 ASP.NET 的一些问题也是如此……

标签: database relational-database optimistic-concurrency


【解决方案1】:

如果您说的是 调度器,它的操作是基于时间戳的,并且允许回滚事务使用其“旧”时间戳“重新进入调度队列”,那么净效应可能是调度程序立即为来自该事务的任何请求赋予最高优先级,而净效应可能是导致该事务回滚的任何问题几乎立即重新出现,可能导致新的回滚,这会导致新的“重新进入调度队列”等等。

或者“立即重新进入队列”的最终结果可能是所有其他事务都被停止。

想想邮局里的人排队,有人的请求无法得到服务,而那个人被允许立即重新进入前面(而不是后面)的队列。需要多长时间才能轮到您?

【讨论】:

  • 我给出的原因是:如果 Transaction T 发出 read(q) 并且与 q 关联的 W-timestamp 比 T 的大,这意味着 T 正在尝试读取以读取值q 那是改变。所以它被回滚并被赋予一个新的时间戳。所以它将能够执行 read(q) 。如果保留旧的时间戳,它将随着时间戳的增加而不断回滚。有道理吗?
  • 看来我完全错过了你问题的重点。然而,当我搜索“时间戳排序协议”时,前两个结果行是一个 PDF 和一个来自 cs.virginia.edu 和 cs.ust.hk 的 PPT,似乎至少包含正确答案的线索。
【解决方案2】:

因为可能有其他事务已使用新时间戳提交

  • 初始时间戳在 X
  • 事务 T1 开始
  • T1 分配时间戳,将其值增加到 X+1
  • 事务 T2 开始
  • T2 分配时间戳,将其值增加到 X+2
  • T2 提交
  • T1 回滚

如果 T1 将时间戳回滚到 X,那么第三个事务将与 T2 的分配值产生冲突。增量和序列也是如此。如果您需要单片序列值(无间隙),则事务必须序列化,而这会以糟糕的性能为代价。

【讨论】:

  • 我给出的原因是:如果 Transaction T 发出 read(q) 并且与 q 关联的 W-timestamp 比 T 的大,这意味着 T 正在尝试读取以读取值q 那是改变。所以它被回滚并被赋予一个新的时间戳。所以它将能够执行 read(q) 。如果保留旧的时间戳,它将随着时间戳的增加而不断回滚。有道理吗?
  • 我误读了这个问题。您的问题完全是关于时间戳排序协议(即类似于快照隔离)。我回答了一个关于数据库中时间戳(即 ROWVERSION 数据类型)的实际问题。
【解决方案3】:

在时间戳排序协议中,开始时分配给事务的时间戳用于识别与其他事务的潜在冲突。这些可能是更新此事务尝试读取的对象的事务或读取此事务尝试覆盖的值的事务。因此,当一个事务被中止并重新启动(即保持可串行化)时,事务的所有操作都将重新执行,这就是需要分配新时间戳的原因。

从理论上讲,在事务仍在使用旧时间戳时再次重新运行操作是不正确且不安全的,因为它会读取/覆盖新值,同时认为它位于较旧的时刻。从实际的角度来看,如果事务继续使用旧的时间戳,很可能它会不断地中止和重新启动,因为它会一次又一次地与相同的事务发生冲突。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2014-03-05
    • 2019-09-12
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多