并行执行,串行解释

多个事务可以交错执行,只要成功提交的整体效果能够对应某个逐一执行的顺序,就仍然可串行化。这个条件约束可接受的结果,不要求数据库实际把所有事务排成一条执行队列。

可串行化因此与“每次读取都来自一个完整快照”不同。两个事务各自看到稳定数据,仍可能根据彼此尚未提交的决定作出不相容修改,最后无法解释为任何一个先、另一个后的执行结果。

参考:[1]

冲突不只发生在同一行

设两个值a和b起初都为1。事务甲读到b为1才把a改成0,事务乙读到a为1才把b改成0;若两者都依据旧快照提交,就会得到a和b均为0。

任何串行顺序都会让后执行者看到前者的修改,因而不再满足自己的条件。这个假设例子说明,只防止两人同时覆盖同一行,仍不足以处理跨行读写依赖;必须分析整个事务集合的关系。

参考:[1]

检测与重试完成保证

PostgreSQL的Serializable Snapshot Isolation在快照之外监测可能导致串行化异常的依赖,并可能拒绝其中一个事务。相关跟踪本身不把所有读取都变成阻塞其他写入的普通排他锁。

应用必须准备重试被撤销的完整事务,包括重新取得决定所用的数据。成功提交前读到的临时结果,不能先被当作不可撤销的外部事实;冲突失败是这种保证的一部分,而不是数据库已经接受了错误结果。

参考:[1] [2]