Вопрос проверяет понимание механизмов долговечности (durability) в PostgreSQL, включая WAL и контрольные точки.
Долговечность (Durability) — одна из ключевых характеристик ACID. В PostgreSQL она реализована через механизм Write-Ahead Logging (WAL). Суть в том, что перед тем как изменить страницу данных на диске, сервер записывает запись об этом изменении в журнал WAL. Это гарантирует, что даже при внезапном сбое питания или крахе системы, все завершённые транзакции могут быть восстановлены.
Каждая транзакция, которая изменяет данные, сначала фиксирует изменения в WAL-буфере. При COMMIT сервер сбрасывает буфер на диск (синхронизирует WAL-файл). Только после этого транзакция считается завершённой. Сами страницы данных могут быть записаны позже, в фоновом режиме, во время контрольных точек (checkpoints).
-- Проверка текущего режима синхронизации WAL
SHOW synchronous_commit;
-- Возможные значения: on, remote_write, remote_apply, off
-- Установка строгой синхронизации (по умолчанию)
ALTER SYSTEM SET synchronous_commit = 'on';
SELECT pg_reload_conf();Контрольная точка — это момент, когда все грязные страницы (изменённые, но ещё не записанные на диск) принудительно сбрасываются. После этого WAL-журнал можно очистить. Параметр checkpoint_timeout (по умолчанию 5 минут) и max_wal_size управляют частотой контрольных точек.
Долговечность в PostgreSQL критична для систем, где потеря данных недопустима (финансы, бронирования). Используйте WAL и настройте synchronous_commit в зависимости от компромисса между производительностью и надёжностью.