“ARIES 在 预写日志 和 steal/no force 缓冲管理 上运行。更新日志通常含 LSN、事务 ID、、页 ID、redo/undo 信息;每个数据页记录 。重启按三阶段执行。”
形式陈述 ​
缓冲管理器决定脏页何时从内存写回稳定数据库,这与 数据库事务 的逻辑 commit 并非同一时刻。两条独立策略轴为:
- steal:允许为了腾出缓冲帧,把含未提交事务更新的页写回;no-steal 则禁止;
- force:提交时必须把该事务修改的所有页写回;no-force 则允许提交后仍留在内存。
由此得到恢复需求:
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。
例子与边界
缓冲池只有两个帧。未提交事务
此时崩溃,磁盘可能含未提交的
若采用 no-steal,
同一页混有多个事务更新时,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。