Из того, что я понял об алгоритмах ARIES, для поддержки транзакций ACID необходимо использовать WAL (Write Ahead Logging): все записи регистрируются.
Говорят, что это дает базе данных возможность откатывать изменения, сделанные незафиксированной транзакцией до сбоя.
Для каждой записи мы регистрируем информацию о фактической записи (как ПОВТОРИТЬ, как ОТМЕНИТЬ).
На этапе восстановления мы анализируем журнал для выполнения операций REDO:
- мы читаем запись в журнале
- мы применяем изменение к базе данных
- мы устанавливаем запись в журнале как выполненную
А затем, чтобы выполнить UNDO, записывается новая запись в журнал (потому что это все-таки запись), затем изменение применяется к базе данных во время контрольной точки.
Думаю, во время контрольной точки мы просто выполняем REDO для всех зафиксированных записей.
Я не нашел никакой информации о том, что произойдет, если:
- авария на контрольно-пропускном пункте
- происходит сбой на этапе REDO, после того, как изменение было применено к базе данных, и до/во время обновления журнала, чтобы установить его как выполненное
В этих случаях к базе данных были применены некоторые изменения, которые не отражаются в журнале, оставляя базу данных в несогласованном состоянии.
NB: Вот некоторые из ссылок, которые я использовал, чтобы узнать больше о транзакциях 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, чтобы понять, как все это реализовано.
Заранее спасибо за любые разъяснения по этой теме.