例如,如果我们有时间表 S1 :
r1[C] r2[A] r1[C] w3[B] w2[B] w1[C] commit1 r2[A] commit2 w3[B] commit3
Run Code Online (Sandbox Code Playgroud)
我们知道这个调度不是冲突可串行化的,因此它不能来自两阶段锁定,但它是视图可串行化的。然而,如果我们想将严格的 2PL 应用于上述时间表,答案是:
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 上的最后一次写入将由 T2 完成,这与原始调度 S1 不同。
或者严格 2PL 的正确应用如下:
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 相锁定(严格)的正确方法是什么?
每次我们应用两相锁定时,是否必须保持命令顺序与原始计划相同?