什么是DBMS中的乐观并发控制?
所有数据项在事务结束时更新,如果发现任何数据项与其中的值不一致,则回滚事务。
在事务结束时检查冲突。事务执行期间不进行检查。所有检查一次性完成,因此事务执行开销低。更新在事务结束之前不应用。它们应用于事务空间中的本地副本。
阶段
乐观并发控制有三个阶段,如下所述:
读取阶段
读取各种数据项并将其存储在临时变量(本地副本)中。所有操作都在这些变量中执行,而无需更新数据库。
验证阶段
检查所有并发数据项以确保可串行化,如果事务更新实际上应用于数据库,则不会进行验证。任何值的更改都会导致事务回滚。使用事务时间戳并维护写集和读集。
要检查事务 A 是否不会干扰事务 B,必须满足以下条件:
TransB 在 TransA 开始读取阶段之前完成其写入阶段。
TransA 在 TransB 完成其写入阶段后开始其写入阶段,并且 TransA 的读集与 TransB 的写集没有共同项。
TransA 的读集和写集与 TransB 的写集都没有共同项,并且 TransB 在 TransA 完成其读取阶段之前完成其读取阶段。
写入阶段
如果验证成功,则将事务更新应用于数据库。否则,将丢弃更新并中止和重新启动事务。它不使用任何锁,因此没有死锁,但是可能会发生数据项的饥饿问题。
问题
S: W1(X), r2(Y), r1(Y), r2(X).
T1 -3
T2 – 4
检查时间戳排序协议是否允许调度 S。
解决方案
最初对于数据项 X,RTS(X)=0,WTS(X)=0
最初对于数据项 Y,RTS(Y)=0,WTS(Y)=0
For W1(X) : TS(Ti)<RTS(X) i.e. TS(T1)<RTS(X) TS(T1)<WTS(X) 3<0 (FALSE)
=>转到 else 并执行写入操作 w1(X) 和 WTS(X)=3
For r2(Y): TS(T2)<WTS(Y) 4<0 (FALSE)
=>转到 else 并执行读取操作 r2(Y) 和 RTS(Y)=4
For r1(Y) :TS(T1)<WTS(Y) 3<0 (FALSE)
=>转到 else 并执行读取操作 r1(Y)。
For r2(X) : TS(T2)<WTS(X) 4<3 (FALSE)
=>转到 else 并执行读取操作 r2(X) 和 RTS(X)=4
广告