我正在数据库中学习OCC,前向OCC算法需要一个事务来验证所有并行运行但仍处于读取阶段的事务。我很困惑为什么它可以确保保留提交顺序的可序列化性(COCSR,这意味着等效的序列化顺序与提交顺序相同)。
实际上,我可以举一个这样的反例:
tx1: |--r(x)---|--validation--|------w(y)----|
tx2: |----r(z)----------r(y)----------|
对tx1
的验证将通过,因为在其验证阶段它看不到r(y)
的{{1}}。 tx2
是只读事务,因此不需要验证阶段。 (该算法摘自《交易信息系统》一书)
但是,tx2
在tx1
之前提交,但是tx2
没有看到tx2
写入的值。这与COCSR的定义相矛盾,为什么?
答案 0 :(得分:1)
验证写入阶段是关键部分。当一个线程处于val-write阶段时,其他任何线程都不能执行任何读/写操作。
tx1:| --r(x)---(-validation --- w(y)-)---- |
tx2:| ---- r(z)------------------------------ r(y)- ----- |