如果 Aries 算法已经知道在分析阶段之后要撤消哪些事务,为什么 Aries 算法会在撤消之前应用重做?
我知道(认为)它与 Lsn 编号和保持一致性有关,因为在磁盘上刷新的数据可能与在崩溃时撤消事务不同(由于脏),撤消事务页),但我找不到任何形式的“正式”回答这个问题(至少一个我能理解的)。
因为即使提交了事务,缓冲区上也可能存在未刷新的页面。ARIES在缓冲区管理器中使用no-force 。重做会将事务表和脏页表带到崩溃时的状态。因此,成功的交易可以反映到稳定的存储中。
我们需要在重做过程中重复所有历史崩溃,以在执行撤消过程之前确保数据库的一致性。
恢复算法 ARIES,为了保证 DBMS 的原子性和持久性,执行 3 遍:
UNDO 数据日志是逻辑的,而 REDO 数据日志是物理的:
不知道 aries 是什么,但假设它与其他数据库相同:
从一些基础备份开始应用重做日志,这基本上意味着在备份之后但在崩溃之前发生的所有数据更改语句都被应用。否则,您将丢失自上次备份以来发生的一切。
完成后,所有未完成的事务都会回滚,因为没有人可以拿起这些事务来完成它们。
您可以考虑在重做和撤消期间真正做了什么。根据退出的日志,重做正在重复历史。相反,撤消是创建新的 CLR 日志记录。当系统崩溃时,日志中有关于未提交的 xact 的记录。如果不撤消它们,将不会有 CLR 日志记录,从而导致不一致。
您希望在失败时返回状态,以便准确了解哪些事务需要撤消。想到的一个例子是连续的失败。从崩溃中恢复时的精确故障。在恢复期间,您将您的操作写入日志。如果您在恢复过程中失败,您将重做日志中的所有操作(甚至是上次尝试期间写入的 UNDO 操作!!)。
它提供了一个简单的算法,因为您不必处理特殊情况和特殊情况的特殊情况。可以保证,在恢复期间发生任何数量的崩溃后,我们将回到与恢复期间没有崩溃相同的状态。
如果您不支持记录级锁定,那么您可以使用仅重做获胜者事务的选择性重做。否则,最好在撤消之前重复历史(全部重做)
ARIES 的目标之一是简单。虽然重做之后的撤消可能不是必需的,但它使算法的正确性比在重做之前进行撤消的更复杂的方案更明显。
除了确保数据库是一致的并且磁盘与崩溃发生之前完全相同(正如 Franck Dernoncourt 回答的那样),在撤消之前执行重做的另一个好处是:
在恢复过程中可能会发生故障。Redo推进了整个“增量恢复”的进程,即如果redo或undo过程中发生故障,如果redo在undo之前执行,则下一个恢复可以拾取上一个恢复(redo)剩下的部分继续进行。
一个极端的情况是,如果 undo 在 redo 之前执行,并且在 undo 过程中再次失败,那么所有的 undo 都将成为徒劳。