📜  DBMS 中的 Thomas 编写规则

📅  最后修改于: 2021-09-27 15:15:41             🧑  作者: Mango

时间戳排序协议规定,如果 R i (X) 和 W j (X) 是冲突操作,则当且仅当 TS(T i ) < TS(T j ) 时, R i (X) 在 W j (X) 之前处理。每当调度没有根据时间戳遵循可序列化顺序时,用户通常会拒绝它并回滚事务。另一方面,有些操作是无害的,可以被允许。

Thomas Write Rule 允许此类操作,并且是对基本时间戳排序协议的修改。在 Thomas Write Rule 中,用户忽略过时的写入。此外,在所有已经讨论过的并发协议中,并发是强加在可序列化冲突的调度上的,在 Thomas Write Rule 中,最重要的改进是用户可以通过查看可序列化调度来实现并发。

首先,让我们说明什么是 Thomas Write Rule,然后它对 Basic TO 协议有哪些修改和改进。

托马斯写规则——
Thomas 写入规则不强制冲突可串行化,但通过修改 W_item(X) 的检查操作来拒绝较少的写入操作

  1. 如果R_TS(X) > TS(T) ,则中止并回滚 T 并拒绝操作。
  2. 如果W_TS(X) > TS(T) ,则不执行写操作并继续处理。这是Outdated 或 Obsolete Writes 的情况。请记住,Thomas Write Rule 会忽略过时的写入,但遵循基本 TO 协议的事务将中止此类事务。
  3. 如果 1 或 2 中的条件都不发生,则且仅在此之后才执行 T 的 W_item(X) 操作并将 W_TS(X) 设置为 TS(T)

过时的写入示例 –
Thomas Write Rule 的主要更新是忽略过时的写入操作。这样做是因为某个时间戳大于 TS(T) 的事务(即 TS 排序中 T 之后的事务)已经写入了 X 的值。因此,逻辑上用户可以忽略 T 的 Write(X) 操作,它变为过时的。让我们通过一个例子来了解这一点:

假设用户有一个时间表,其中有两个事务 T 1和 T 2 。现在, TS(T 2 ) < TS(T 1 ) 。这意味着 T 1在 T 2之后到达,因此具有比 T 2更大的 TS 值。这意味着允许的调度的可串行化为T 2 –> T 1 。考虑下面给出的部分时间表:

3333

图像 –过时的写入示例

因此在符合第二协议的规则中忽略过时的写入。这似乎更合乎逻辑,因为用户跳过了重新启动整个事务的不必要过程。该协议只是对基本 TO 协议的修改。

基本 TO 协议 v/s Thomas 编写规则 –
假设用户有一个时间表,其中有两个事务 T 1和 T 2 。现在, TS(T 2 ) < TS(T 1 ) 。这意味着允许的调度的可串行化为T 2 –> T 1 。考虑这两个协议,让我们看看在它们下允许和不允许哪些类型的操作。 R i (A)表示读操作, W i (A)表示写操作。现在,让我们看看 Basic TO 和 Thomas Write Rule 中允许的部分调度类型,您将了解这两种协议的操作差异。用户在两个协议中区分允许和不允许的操作。

   

Basic TO Protocol

  • Not Allowed 
    • R1(X) W2(X)
    • W1(X) R2(X)
    • W1(X) W2(X)
  • Allowed 
    • All operations where T2 occurs before T1.
    • R1(X) R2(X)

Thomas Write Rule

  • Not Allowed 
    • R1(X) W2(X)
    • W1(X) R2(X)
  • Allowed 
    • All operations where T2 occurs before T1.
    • Outdated Writes: W1(X) W2(X)
    • R1(X) R2(X)

因此,从上面的列表中,与基本 TO 协议相比,Thomas Write Rule 中使用的这种修改。

参考:数据库系统概念,第五版 [Silberschatz、Korth、Sudarshan],第 16 章