根据我对 ARIES 算法的理解,要支持 ACID 事务,必须使用 WAL(预写日志):所有写入都会被记录。
据说它使数据库能够在崩溃之前回滚由未提交事务所做的更改。
对于每次写入,我们都会记录有关实际写入的信息(如何重做,如何撤消)。
在恢复阶段,我们分析日志以执行 REDO 操作:
- 我们阅读了日志条目
- 我们将更改应用到数据库
- 我们将日志条目设置为完成
然后,为了执行 UNDO,写入新的日志条目(因为它毕竟是写入),然后在检查点期间将更改应用于数据库。
在检查点期间,我想我们只是对所有提交的条目执行重做。
我还没有找到任何有关以下情况的信息:
- 检查点期间发生崩溃
- 在重做阶段、更改应用到数据库之后以及更新日志之前/期间将其设置为完成时发生崩溃
在这些情况下,一些更改已应用到数据库,但未反映在日志中,从而使数据库处于不一致状态。
注意:这是我用来了解更多关于 ACID 事务和 ARIES 算法的一些链接:
- https://en.wikipedia.org/wiki/Algorithms_for_Recovery_and_Isolation_Exploiting_Semantics
- http://www-inst.eecs.berkeley.edu/~cs186/sp08/aries.html
- https://fr.slideshare.net/PulasthiLankeshwara/aries-recovery-algorithms
- http://blog.franslundberg.com/2013/12/acid-does-not-make-sense.html
我目前正在阅读 SQLite 的源代码,以了解整个事情是如何实现的。
提前感谢您对此主题的任何澄清。