Ответ
Durability (Долговечность) — это свойство транзакций в ACID, гарантирующее, что после успешного завершения (COMMIT) все внесённые изменения сохраняются в базе данных на постоянном носителе (например, на диске) и не будут потеряны даже в случае системного сбоя, отключения питания или перезапуска сервера.
Как это обеспечивается на практике? Основной механизм — журнал транзакций (Write-Ahead Log, WAL). Перед тем как изменения будут записаны в основные таблицы на диске, они сначала фиксируются в специальном журнале. Этот журнал организован так, чтобы его запись была последовательной и атомарной, что делает её очень быстрой и надёжной. В случае аварии СУБД может восстановить состояние данных, "проиграв" (replay) записи из этого журнала.
Пример настройки в PostgreSQL для строгой гарантии:
-- Гарантирует, что транзакция не будет считаться завершённой,
-- пока её запись не будет записана на диск.
ALTER SYSTEM SET synchronous_commit = ON;
Важные нюансы и компромиссы:
- Производительность vs. Надёжность: Самые строгие настройки durability (например,
innodb_flush_log_at_trx_commit=1в MySQL) требуют синхронной записи журнала на диск для каждой транзакции, что снижает пропускную способность. Более слабые настройки (0или2) могут повысить производительность, но рискуют потерей последних транзакций при сбое. - Зависимость от оборудования: Гарантии durability также зависят от корректной работы оборудования (например, дисков с кэшированием без батарейной поддержки могут сбросить кэш при отключении питания, потеряв данные).
- Распределённые системы: В распределённых БД обеспечение durability усложняется и часто связано с консенсус-алгоритмами (например, Raft), которые реплицируют журнал на несколько узлов перед подтверждением записи.