“事务调度是 冲突可串行化、视图可串行化、SQL 隔离现象以及恢复性层级的共同输入。共享一个明确事件字母表能避免同一符号在一处表示逻辑写、另一处却表示物理页刷盘。”
形式陈述 ​
两个包含相同已提交事务与读写操作的 事务调度
- 在
中读取初值的操作,在 中也读取初值; - 若
在 中读取 产生的值,它在 中仍从同一个 读取; - 在
中对 作最终写的事务,在 中仍是最终写者。
若
每个 冲突可串行化 调度都视图可串行化,反向却不成立。一般有限调度的视图可串行化判定是 NP-complete;这与冲突图无环的多项式判定形成实质差别。若调度没有盲写——每个写入事务在写前已读相应数据项——视图可串行化但非冲突可串行化的额外空间会消失。
NP 上界的证书是一个事务全序:按该顺序排成串行调度后,可在多项式时间内核对每个读来源、初值读取和最终写者。困难在于从交错操作中找到这个顺序,而不是验证一个已经给出的见证。NP-complete 结论针对一般输入,并不说每个实际调度都难判。
直觉
视图等价像比较两次演出中观众真正看见的接力关系。每位读者拿到的是哪位写者交出的值,开场前的初值由谁读到,落幕时最后一笔是谁写下,这三类观察相同即可。后台两次没人读取的写入先后可能变化,而不影响这份视图。
这种宽容带来计算代价。冲突图把每个可能改变语义的操作对都固定成边,容易检查但有时过于保守;视图判定要猜一个串行顺序,再核对读来源与最终写者,盲写使许多候选无法由局部边直接排除。
三项条件各守一扇门:initial-read 防止把本应读数据库初态的操作放到某个写者之后;reads-from 固定事务之间的数据依赖;final-write 固定外部最终能看见谁的版本。删除任一项都能构造错误的“等价”顺序。
例子与边界
事务
w1(x,1); w2(x,2); w1(x,3)
冲突图既有
若在
这里讨论的是逻辑读写。触发器、谓词查询和多版本读取会改变“同一个写”的身份;必须先正规化事件与版本。提交失败的事务是否保留在视图中也要预先约定,通常对已提交投影判断串行性,再由恢复条件处理中止效果。
“最终数据库相同”远弱于视图等价。若
推论与应用
视图可串行化给出比冲突判据更宽的正确历史集合,却很少直接作为在线调度器的完整判定目标。系统更常采用锁、时间戳或验证协议生成易证的子类,因为在每次提交处解决一般 NP-complete 搜索并不现实。
盲写密集的批量装载或覆盖更新最能暴露两种定义的差别。审计器若只报告冲突环,应把结论写成“不是冲突可串行化”,不能直接升级为“没有任何串行视图”;若要作后一判断,必须给出三项视图条件或一个不可能性证明。
工程系统常用冲突可串行化作为可执行保证,再把视图理论用于解释这份保证为何保守。若要利用更宽集合提升并发,协议必须维护足以证明读来源和最终写者的状态;“某次测试结果一样”不是可复用的调度规则。
参考资料
- Christos H. Papadimitriou, “The Serializability of Concurrent Database Updates,” Journal of the ACM 26(4), 1979, pp. 631–653。
- Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987, Ch. 2。
- Hector Garcia-Molina, Jeffrey D. Ullman, and Jennifer Widom, Database Systems: The Complete Book, 2nd ed., Pearson, 2008, Ch. 18。