“消息传递中的崩溃使 2PC 依赖 write ahead log、幂等消息、超时与人工或启发式恢复。它协调数据库分片、消息系统和其他跨资源事务的 commit/abort,但不提供事务隔离;…”
形式陈述
先固定事务调度的读取语义以及要比较的观察。调度
冲突可串行化采用更严格而易检验的等价关系:不同事务对同一数据项的两个操作,只要至少一个是写,就构成冲突;要求所有冲突对的相对顺序不变。以事务为顶点、按冲突先后连边得到前驱图。单版本读写模型中,调度冲突可串行化当且仅当该图无环,此时任一拓扑序给出冲突等价的串行次序。
该无环判据刻画的是冲突等价这一版本。视图可串行化允许某些改变了冲突次序但未改变读取来源与最终写者的重排。涉及已中止或未完成事务时,还须明确所取投影和恢复语义,不能在遇到反例后任意删除事务。
直觉
可串行化把交错历史投影成事务之间的先后约束:只要存在某个串行次序能产生相同观测效果,并发执行就没有暴露不可解释的中间状态。冲突可串行化用读写冲突构造 precedence graph,环表示事务先后要求自相矛盾。它允许所选串行次序违背现实完成时间,所以与严格可串行化不同。
例子与边界
设初始 r1(x)->0; r2(x)->0; w1(x,1); w2(x,1); c1; c2。两个事务都想把读值加一。由
再看 blind write:w1(x,1); w2(x,2); w1(x,3); c2; c1 没有任何读,最终写者为
可串行化还不自动给出恢复性。例如 w1(x,1); r2(x)->1; c2; a1 的冲突图只有
推论与应用
冲突约束无环时,其传递闭包构成严格偏序;拓扑排序把它扩展为串行全序。两阶段锁与时间戳排序可直接约束该图,MVCC则保存多个版本并用可见谓词选择读版本;它是一类实现机制,不是可串行化的同义词。
乐观并发验证提供另一种可逐事件执行的充分机制:事务先在固定快照上计算,在一个原子入口内核对全部外部读依据并发布私有写,成功事务按提交顺序得到串行见证。检查与发布若拆开,两笔旧决定都可能获准;允许盲写按提交序覆盖也不等于采用SI的写写提交规则。
快照隔离让事务读取开始时的一致快照,并以 first-committer-wins 排除并发同项写入,却允许 write skew:两个事务读取对方将覆盖的旧版本、分别写不同数据项时,会形成双向读写反依赖环。完整历史与约束违反由 SI 专页承接,本页保留串行等价与图无环判据。
与线性一致性一样尊重非重叠事务实时顺序的版本称为严格可串行化;原子提交、持久性和可恢复性仍需日志与两阶段提交等独立协议。
参考资料
- Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987,Chs. 2–3, serializability theory and precedence graphs。
- Jim Gray and Andreas Reuter, Transaction Processing: Concepts and Techniques, Morgan Kaufmann, 1992,Chs. 6–9, transaction histories and serial equivalence。