3

ARIES 算法中,为什么需要在 redo pass 中重复崩溃前的所有历史?我可以在分析过程中获取已提交的事务编号,然后重做已提交的事务日志记录吗?这种方法将减少需要重做和撤消的记录数。

4

2 回答 2

3

简短的回答:

我们需要在重做过程中重复崩溃之前的所有历史记录,以确保执行撤消过程之前的数据库一致性。

长答案:

恢复算法 ARIES,为了保证 DBMS 的原子性和持久性,执行 3 遍:

  1. 分析通行证:看看需要做什么(播放日志转发)
  2. Redo pass:确保磁盘反映日志中但不在磁盘上的任何更新,包括属于最终将回滚的事务的更新。这样可以确保我们处于一致的状态,这将允许逻辑撤消。
  3. Undo pass : 删除任何丢失交易的动作

UNDO 数据日志是逻辑的,而 REDO 数据日志是物理的:

  • 我们必须进行物理重做,因为我们不能保证数据库处于一致状态(例如,记录“INSERT VALUE X INTO TABLE Y”可能不是一个好主意,因为 X 可能会反映在索引中,但不是表格,反之亦然,以防插入时发生崩溃)
  • 我们可以做逻辑UNDO,因为在REDO之后我们知道事情是一致的。事实上,我们必须进行逻辑 UNDO,因为我们只 UNDO 一些操作,并且物理记录形式的 UNDO,例如,“拆分索引 y 的页面 x”在索引管理或不变量方面可能不再是正确的做法维护。在重做期间我们不必担心这一点,因为我们重复历史并重播所有内容,这意味着上次对数据库所做的任何物理修改仍然是正确的。

资源

于 2013-04-12T02:35:37.083 回答
0

原因是因为 ARIES 被设计为使用无暴力/偷窃方法。“窃取”部分意味着来自未提交事务的更改可能会写入磁盘。因此,我们需要重做所有已提交和未提交的事务,以便我们可以撤消未提交的事务。

于 2012-12-07T15:55:01.043 回答