Что означает принцип Durability (D) в контексте ACID?

Ответ

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

Как это достигается?

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

Пример на Go с database/sql:
Когда метод tx.Commit() успешно выполняется, СУБД на своей стороне обеспечивает долговечность. Если Commit() вернёт ошибку, или программа упадёт до вызова Commit(), изменения будут отменены.

// db - это ваше соединение с базой данных (*sql.DB)
tx, err := db.Begin() // Начинаем транзакцию
if err != nil {
    log.Fatal(err)
}

// Выполняем операции в рамках транзакции
_, err = tx.Exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
if err != nil {
    tx.Rollback() // Откатываем изменения в случае ошибки
    return
}

// На этом этапе изменения еще не сохранены надежно

err = tx.Commit() // Фиксируем транзакцию
// После успешного вызова Commit() СУБД гарантирует, что данные сохранены (Durability)
if err != nil {
    log.Fatal(err)
}