Skip to content

Steal/No-force 缓冲管理

Steal/no-force buffer management · Steal and no-force policies

以未提交页能否提前写回和提交页是否必须立即写回两条独立轴,推导恢复所需的 UNDO 与 REDO 能力。

条目类型
模型

形式陈述

缓冲管理器决定脏页何时从内存写回稳定数据库,这与 数据库事务 的逻辑 commit 并非同一时刻。两条独立策略轴为:

  • steal:允许为了腾出缓冲帧,把含未提交事务更新的页写回;no-steal 则禁止;
  • force:提交时必须把该事务修改的所有页写回;no-force 则允许提交后仍留在内存。

由此得到恢复需求:

steal需要 UNDO,no-force需要 REDO.

no-steal/force 组合可以避免常规崩溃恢复中的 undo 与 redo,却可能要求巨大缓冲并在提交路径同步写许多随机页。steal/no-force 提高替换自由和提交吞吐,代价是同时保留两种恢复能力。

四种组合应分别读取:no-steal/no-force 只需要 redo;steal/force 只需要 undo;no-steal/force 在理想页写模型下两者都省;steal/no-force 两者都需。这里的“需要”指由页调度造成的最低恢复能力,页撕裂、系统元数据或媒体故障仍可增加日志责任。

steal 本身不保证安全。页若先于撤销信息落盘,崩溃后无法识别或恢复旧值;实际系统通常 使用预写日志 约束这个顺序。no-force 也要求提交记录与 redo 信息先持久化,否则延迟页在崩溃后无从补回。

直觉

steal 回答“内存不够时,能否把尚未结账的草稿先放进档案柜”;force 回答“结账时,是否必须立刻把所有正式页面归档”。一个看提交前,一个看提交点,不能把它们当成互为反义的单轴选择。

工程上最常见的 steal/no-force 让热页可以自由换出,又让 commit 只顺序刷日志而不等待分散的数据页。恢复算法于是承担“先重现崩溃现场,再撤掉未完成工作”的复杂性。

两个名称描述许可而非频率。steal 系统可以在内存充足时长期不偷页,no-force 系统也可以后台主动刷完某个事务的全部页;不能从一次 trace 没发生 steal 就把系统分类成 no-steal。

例子与边界

缓冲池只有两个帧。未提交事务 T1 把页 P 从 4 改成 5;为装入新页,系统在相应 undo 日志稳定后把 P=5 写盘,这是一笔 steal。另一个事务 T2 把页 Q 从 8 改成 9,稳定写入更新日志和 commit 记录后返回成功,却让 Q 仍留在内存,这是 no-force。

此时崩溃,磁盘可能含未提交的 P=5,却仍是已提交前的 Q=8。恢复必须 undo T1,把 P 还原为 4;同时 redo T2,把 Q 推进到 9。两个方向来自两笔不同事务和不同页面,不是对同一更新既撤销又重做。

若采用 no-steal,T1 的脏页在结束前不能成为替换受害者;一个修改页数超过缓冲容量的大事务便需要私有溢出区或其他设计,不能凭定义假设所有页都留在 RAM。若采用 force,提交要等待数据页稳定,但仍可能需要日志处理页撕裂、系统事务或媒体恢复。

同一页混有多个事务更新时,force 的归属也需精确定义。把页写盘可能顺带持久化另一个未提交事务的字节,若系统允许这种情况便表现出 steal;“我是为了已提交事务刷页”不能改变页面实际携带的更新集合。

推论与应用

ARIES以 steal/no-force 为主要环境:redo 阶段重复历史,undo 阶段只撤销 loser。Dirty Page Table 记录哪些页可能尚未稳定,Transaction Table 记录哪些事务可能需要撤销,正好对应两条策略造成的不确定性。

性能比较必须算清 I/O 位置与批量。force 并非只多写几个字节,它可能把顺序日志提交变成多个随机页写;no-steal 也不只是占用内存,它会限制页替换和长事务规模。策略名称描述允许性,不代表系统每次都会选择最早 steal 或永不主动刷 no-force 页。

恢复测试应构造一对互补页面:一个只含 loser 的已落盘更新,一个只含 winner 的未落盘更新。重启后前者必须回退、后者必须前进;只测试单页单事务,容易把 redo 与 undo 路径互相遮蔽。

参考资料
  • Jim Gray and Andreas Reuter, Transaction Processing: Concepts and Techniques, Morgan Kaufmann, 1992, Chs. 9–11。
  • Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987, Chs. 6–7。
  • C. Mohan et al., “ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging,” ACM Transactions on Database Systems 17(1), 1992, pp. 94–162。
关系图谱3 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具