Ответ
WAL (Write-Ahead Log) хранит изменения данных до их записи в основную БД. При восстановлении:
- Незавершенные транзакции - откатываются (rollback) по записям WAL
- Завершенные транзакции - применяются (redo) из WAL, если не попали в основную БД
Пример для PostgreSQL:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Сбой системы здесь
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
При восстановлении:
- Проверяет статус транзакции в WAL
- Если COMMIT есть - выполняет оба UPDATE
- Если COMMIT отсутствует - откатывает первый UPDATE
WAL содержит:
- Идентификатор транзакции (XID)
- Тип операции (INSERT/UPDATE/DELETE)
- Старые и новые значения данных
- Метки времени и контрольные точки