Что означает принцип 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)
}

Ответ 18+ 🔞

Ага, слушай, вот эта штука — Durability, или по-нашему «Долговечность». Это один из тех четырёх китов, на которых держится вся эта ACID-хуита. Суть простая: если транзакция успешно завершилась, то её результаты будут сохранены навечно, как будто их в граните высекли. Даже если серверу внезапно приспичит накрыться медным тазом — отключится питание, упадёт процесс, случится пиздец — данные никуда не денутся. Они уже прибиты гвоздями к энергонезависимому хранилищу.

Как это, блядь, работает?

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

Смотри на примере кода на Go:

Когда ты вызываешь tx.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() // А вот теперь — фиксация!
// Если этот вызов прошёл успешно, можешь спать спокойно. СУБД гарантировала, что данные упёрлись в надёжное хранилище. Durability обеспечена, ёпта.
if err != nil {
    log.Fatal(err)
}

Вот и весь секрет. Никакой магии, просто продуманная система, которая не даёт твоим данным сгинуть в небытие из-за какой-нибудь внезапной ебли с электричеством.