Что такое ACID принципы транзакций в базах данных
Что проверяют
Знаете ли вы четыре свойства и понимаете ли, что изоляция бывает разной степени.
Как отвечать
Атомарность. Транзакция выполняется целиком или не выполняется вовсе. Сбой на середине откатывает уже сделанное. Обеспечивается журналом, позволяющим отменить незавершённые изменения.
Согласованность. База переходит из корректного состояния в корректное: ограничения, внешние ключи и проверки соблюдены. Важная оговорка: это не та согласованность, что в теореме CAP. Здесь речь о соблюдении правил целостности, там о том, видят ли все узлы одинаковые данные. Слово одно, смысл разный, и путаница на этом месте встречается постоянно.
Изоляция. Параллельные транзакции не мешают друг другу. Это самое интересное свойство, потому что оно не бинарное: существуют уровни, различающиеся тем, какие аномалии допускаются.
Аномалии по нарастанию строгости защиты:
- грязное чтение: увидеть чужие неподтверждённые изменения;
- неповторяемое чтение: прочитать строку дважды и получить разные значения;
- фантомы: повторный запрос по условию возвращает новые строки;
- потерянное обновление: две транзакции посчитали от одного значения, одно изменение пропало.
В PostgreSQL уровень по умолчанию исключает грязное чтение, а более строгие реализованы через снимки данных. Чем строже уровень, тем больше конфликтов и откатов, поэтому его выбирают осознанно, а не по максимуму.
Долговечность. После подтверждения данные переживут отключение питания. Обеспечивается журналом предзаписи: изменения сначала попадают в журнал и сбрасываются на диск, и только потом считаются подтверждёнными.
Полезное дополнение: в распределённых системах эти гарантии в полном виде недостижимы, и вместо них применяют саги с компенсациями и согласованность в конечном счёте.
Где спотыкаются
Смешивают согласованность из этого набора и из теоремы о распределённых системах.
Считают изоляцию бинарным свойством.
Не могут привести пример аномалии.
Держат транзакцию открытой на время внешнего вызова, теряя смысл всей конструкции.