当 DBMS 在 ARIES 算法的恢复阶段崩溃时会发生什么?

What happens when a DBMS crash during the recovery phase of ARIES algorithms?

根据我对 ARIES 算法的理解,要支持 ACID 事务,必须使用 WAL(预写日志记录):所有写入都会被记录下来。

据说可以让数据库在崩溃前回滚由未提交的事务所做的更改。

对于每次写入,我们都会记录有关实际写入的信息(如何重做,如何撤消)。

在恢复阶段,我们分析日志执行REDO操作:

然后,为了执行 UNDO,写入一个新的日志条目(因为毕竟是写入),然后在检查点期间将更改应用到数据库。

在检查点期间,我想我们只是对所有已提交的条目执行重做。

我还没有找到任何关于在以下情况下会发生什么的信息:

在那些情况下,一些更改已应用到数据库,但未反映在日志中,使数据库处于不一致状态。

注意:这是我用来了解更多关于 ACID 事务和 ARIES 算法的一些链接:

我目前正在阅读 SQLite 的源代码以了解整个事情是如何实现的。

提前感谢您对此主题的任何澄清。

在重做期间,读取日志并修改数据如果需要。如果在 REDO 期间发生崩溃,那么下一次恢复将再次 运行 REDO。一些在第一次恢复尝试时确实修改了数据的日志记录将是空操作,因为数据修改已保存。其他不保存,重新'redone'

检查点仍然是事务处理操作。在内存中保存数据,然后最后在日志中写入检查点日志记录。如果在检查点期间发生崩溃,则它只能在写入检查点记录之前发生。崩溃恢复后再次 运行 并从 REDO 开始(因为没有新检查点的记录)。上面的一点都适用,REDO可以重复运行。一些日志记录将是空操作,因为数据更改已经保存,一些将再次 'redone'。

UNDO 正在通过生成和写入补偿日志记录来工作。如果在 UNDO 期间发生崩溃,那么在下一次恢复时,还有一个记录需要分析和重做(补偿记录)。此 post UNDO 崩溃恢复将 运行 它的 UNDO 阶段开始 最后一次成功的 UNDO 日志记录保存之后。也就是说,如果原始日志在未提交的事务中包含两个操作,比如 OP1 和 OP2,然后启动 UNDO,它会写入补偿性 UNDO-OP1 并崩溃。然后恢复将从 OP2 开始撤消,因为对于 OP1,日志中已经有一个补偿记录(UNDO-OP1)。

在正确实施的 ARIES 中从来没有 window 不一致。