2 相位锁定是否需要保持命令的顺序?

问题描述

例如,如果我们有时间表 S1 :

 r1[C] r2[A] r1[C] w3[B] w2[B] w1[C] commit1 r2[A] commit2 w3[B] commit3

我们知道这个调度不是冲突可序列化的,所以它不能来自两阶段锁定,但它是视图可序列化的。但是,如果我们想将严格的 2PL 应用于上述时间表,答案将是:

  1. x1[C] r1[C] s2[A] r2[A] r1[C] x3[B] w3[B] T2-waits-for-Xlock-on-B w1[C] commit1 u1[C] w3[B] commit3 u3[B] x2[B] w2[B] r2[A] commit2 u2[A] u2[B]

其中 u1[C] 表示 T1 释放对象 C 上的锁。在这种情况下,对 B 的最后一次写入将由与原始计划 S1 不同的 T2 完成。

或者以下是 Strict 2PL 的正确应用:

  1. x1[C] r1[C] s2[A] r2[A] r1[C] x3[B] w3[B] T2-waits-for-Xlock-on-B w1[C] commit1 u1[C] T3-waits-for-T2-to-take-lock-on-B-in-order-to-execute-w2[B]-first

在这种情况下,每个事务的读写顺序都保留了,但会发生死锁。

总结我的问题:在附表 S1 中应用 2 Phase Locking (Strict) 的正确方法是什么?

每次我们应用两阶段锁定时,是否必须保持命令的顺序与原始时间表相同?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)