Ответ
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)
}
Вот и весь секрет. Никакой магии, просто продуманная система, которая не даёт твоим данным сгинуть в небытие из-за какой-нибудь внезапной ебли с электричеством.