Skip to content

可恢复事务调度

Recoverable transaction schedule · Recoverable schedule

要求读取其他事务写入的事务不能先于写者提交,从而避免已承诺结果依赖后来中止的来源。

条目类型
定义

形式陈述

S事务调度。若 rj(x) 读取了 wi(x) 写入的版本,且 Tj 最终提交,则可恢复性要求 Ti 也提交,并且

TirfTjcjSci<Scj.

换言之,消费者可以在生产者尚未提交时读取,但它自己的 commit 必须等待生产者的 commit。若生产者中止,所有依赖该值且尚未提交的消费者也必须中止;可恢复性确保系统尚有机会这样做。

该性质只约束提交次序,不禁止脏读,也不要求调度可串行化。reads-from 必须指向具体写入版本;仅从两个事务都访问过 x 不能推出依赖,读到初值或自己的写时也不产生跨事务提交约束。

若 reads-from 形成链 T1T2Tk,所有事务都要提交时,提交次序必须沿链前进。图有环且每个读依赖都要求严格先提交,则环上事务不可能全部提交;实现必须中止至少一个,不能同时等待彼此的 commit。

直觉

把未提交值看成一张尚未兑现的支票。下游事务可以先拿它计算,却不能在支票兑现前把自己的结果标成不可撤销。否则上游一旦中止,下游已经对外承诺的结果便失去来源。

可恢复调度因此是一条“承诺不得超车”的规则,而不是“不许提前看”。更强的无级联调度会把读取本身推迟到写者提交之后;严格调度还会阻止覆盖未提交写。

这条规则保护的是 commit 的不可逆边界。消费者在内存中做了大量计算仍可撤销,只要尚未承诺;一旦它向客户端确认、释放依赖资源或触发不可回滚副作用,再要求它跟随上游 abort 就已经太晚。

例子与边界

调度

text
w1(x,20); r2(x)->20; c1; c2

是可恢复的。T2 读了 T1 的值,但 c1<Sc2。若 T1 在提交前失败,系统仍可令 T2 一起 abort;这会产生级联回滚,却没有撤销一个已经确认的 T2

把末尾改成

text
w1(x,20); r2(x)->20; c2; a1

便不可恢复。T2 已把依赖值作为提交结果发布,随后 T1 中止;单纯从磁盘删掉 T1 的写不能解释 T2 已产生的状态与外部响应。即使最终页面数值碰巧可修复,提交历史也已违约。

T2 只读取 x 的初值,而 T1 在另一版本上写入,则不能仅因事件在时间上相邻就画 reads-from 边。多版本系统尤其需要版本标识,否则会把合法旧快照误判成脏依赖。

三级链更能看到级联成本:

text
w1(x); r2(x); w2(y); r3(y); a1

若允许这些脏读,a1 迫使 T2 中止,继而迫使 T3 中止。调度只要尚未出现 c2,c3 仍可恢复,但已经完成的工作会成串丢弃;可恢复性没有承诺回滚代价小。

推论与应用

无级联事务调度ci 放到依赖读之前,因此自动满足 ci<rj(x)<cj,是可恢复调度的更强子类。恢复管理器若允许提前脏读,则必须保留依赖图,以便上游 abort 时递归中止所有尚未提交消费者。

可恢复性与持久日志仍是两件事。提交次序正确,却没有把 ci 持久化,崩溃后同样可能忘记写者;反过来,日志完整也不能把不可恢复的 c2<a1 重新解释成合法承诺。

提交协调器可以按依赖图延迟消费者,将多个已经满足前置的事务批量刷入日志。优化不能颠倒边:group commit 可让 ci,cj 共享一次 I/O,但若 Tj 读取 Ti,稳定记录中仍须能恢复“Ti 已提交后才承认 Tj”的逻辑次序。

参考资料
  • Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987, Chs. 2 and 6。
  • Jim Gray and Andreas Reuter, Transaction Processing: Concepts and Techniques, Morgan Kaufmann, 1992, Chs. 6 and 10。
  • Abraham Silberschatz, Henry F. Korth, and S. Sudarshan, Database System Concepts, 7th ed., McGraw-Hill, 2019, transaction recovery chapter。
关系图谱5 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例