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