Ответ
Write-Ahead Log (WAL) — это стандартный механизм для обеспечения атомарности и долговечности (буквы 'A' и 'D' в ACID) в базах данных. Его суть в том, что все изменения сначала записываются в специальный журнал (лог-файл) и только после этого — в основные файлы данных.
Как WAL работает при восстановлении после сбоя:
Когда база данных запускается после сбоя (например, отключения питания), она выполняет процедуру восстановления, используя WAL:
Накатывание (Redo): БД просматривает WAL с последней контрольной точки (checkpoint) и применяет все зафиксированные (committed) транзакции, которые могли не успеть записаться в основные файлы данных. Это обеспечивает долговечность.
Откат (Undo/Rollback): После этого БД ищет в логе транзакции, которые были начаты, но не имеют записи о
COMMIT
. Все изменения, сделанные этими незавершенными транзакциями, отменяются. Это обеспечивает атомарность.
Пример сценария:
Представим транзакцию перевода денег:
BEGIN;
-- 1. Запись в WAL: списать 100 у id=1
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 2. Запись в WAL: начислить 100 id=2
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- !!! В ЭТОТ МОМЕНТ ПРОИСХОДИТ СБОЙ ПИТАНИЯ !!!
COMMIT; -- Эта запись не попадает в WAL
При восстановлении:
- База данных увидит в WAL записи об
UPDATE
для этой транзакции. - Однако она не найдет запись о
COMMIT
. - Система сделает вывод, что транзакция не была завершена, и откатит оба изменения (
UPDATE
). Баланс счетов останется в исходном, согласованном состоянии.