Как гарантируется D в ACID
Что проверяют
Понимаете ли вы, что стоит за словом «сохранено» на уровне базы и диска, а не только определение из учебника. Следом обычно спрашивают, чем рискует настройка synchronous_commit = off и что происходит, если соединение оборвалось прямо во время коммита.
Как отвечать
Durability означает: если база ответила «транзакция зафиксирована», изменения переживут падение процесса и отключение питания. Держится это на нескольких механизмах:
- журнал упреждающей записи (WAL): изменения сначала пишутся в журнал, и только когда запись журнала сброшена на диск через
fsync, клиент получает подтверждение коммита. Страницы самих таблиц пишутся позже, в фоне; - восстановление после сбоя: при старте база проигрывает журнал от последней контрольной точки (checkpoint) и доводит данные до состояния последнего коммита. Контрольные точки нужны, чтобы не проигрывать журнал с самого начала;
- защита от рваных страниц: в PostgreSQL это
full_page_writes, в InnoDB doublewrite buffer; - настройки строгости: в PostgreSQL
synchronous_commit(по умолчаниюon), в MySQLinnodb_flush_log_at_trx_commit = 1по умолчанию. Ослабление ускоряет запись, но при сбое теряются последние транзакции, хотя база остаётся целостной; - репликация: синхронная реплика защищает уже от потери всего сервера, а не только от падения процесса.
С Java-стороны коммит происходит при вызове Connection.commit() или при выходе из метода с @Transactional, и фиксацию означает только успешный возврат. Если соединение упало на коммите, исход неизвестен, поэтому операции делают идемпотентными.
Где спотыкаются
Называют бэкапы механизмом durability. Резервная копия защищает от катастрофы и ошибок людей, а свойство D про то, что подтверждённый коммит не пропадёт при сбое прямо сейчас.
Говорят «данные записаны на диск», имея в виду вызов write. Без fsync они лежат в кеше ОС, а диски без защиты от потери питания могут соврать даже про fsync.
Считают, что после коммита изменения уже в файлах таблиц. На деле гарантию даёт журнал, а файлы данных догоняют его в фоне и на контрольных точках.