Что означает свойство долговечности (Durability) в ACID?

«Что означает свойство долговечности (Durability) в ACID?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Durability (Долговечность) — это свойство транзакций в ACID, которое гарантирует, что после успешного завершения транзакции (COMMIT) все внесенные ею изменения становятся постоянными и сохраняются в базе данных даже в случае последующих сбоев (отключение питания, авария сервера, крах системы).

Как обеспечивается:

  • Журналирование с опережающей записью (Write-Ahead Logging, WAL): Все изменения сначала записываются в устойчивый журнал транзакций (redo-log) на диск, и только затем применяются к основным файлам данных. При сбое система может восстановить состояние, "проиграв" журнал.
  • Синхронная запись: СУБД может ожидать подтверждения от диска о физической записи журнала перед отправкой подтверждения пользователю.

Пример на SQL:

BEGIN TRANSACTION;
    UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT; -- В этот момент изменения гарантированно становятся долговечными

Практические следствия и компромиссы:

  • Надежность vs. Производительность: Строгое обеспечение долговечности через синхронную запись на диск может замедлить работу. Некоторые СУБД позволяют ослабить эту гарантию для повышения производительности (например, SET synchronous_commit = OFF в PostgreSQL).
  • В распределенных системах: Требует дополнительных механизмов, таких как репликация данных на несколько узлов или использование распределенного консенсуса (например, протокол Raft).

Итог: Durability — это обещание СУБД, что подтвержденные данные не будут потеряны.