Что такое транзакции в базах данных и для чего они нужны
Что проверяют
Знаете ли вы ACID не как аббревиатуру, а как четыре разных обещания, и понимаете ли, за что платит каждый уровень изоляции.
Как отвечать
Транзакция это группа операций, которая выполняется целиком или не выполняется вовсе.
A, атомарность. Либо все изменения, либо ни одного. Откат возвращает состояние до начала.
C, согласованность. База переходит из одного корректного состояния в другое: ограничения, внешние ключи и триггеры не нарушаются.
I, изоляция. Параллельные транзакции не видят промежуточных состояний друг друга. Насколько строго, задаёт уровень.
D, долговечность. Зафиксированное переживает падение сервера, за это отвечает журнал упреждающей записи.
Уровни изоляции и что они запрещают:
- read uncommitted: не запрещает почти ничего, в PostgreSQL фактически равен следующему;
- read committed: нет грязного чтения. По умолчанию в PostgreSQL;
- repeatable read: нет неповторяемого чтения, повторный запрос в той же транзакции даёт тот же результат;
- serializable: результат эквивалентен какому-то последовательному порядку. Дороже всего, часть транзакций откатывается с ошибкой сериализации, и приложение обязано уметь повторить.
Где спотыкаются
Расшифровывают ACID, но не могут привести пример аномалии, которую снимает repeatable read.
Считают, что serializable это просто «надёжнее», не упоминая про откаты и необходимость ретраев.
Путают изоляцию и блокировки: в PostgreSQL чтение не блокирует запись, работает MVCC.
Держат транзакцию открытой на время внешнего HTTP-вызова и удивляются исчерпанному пулу соединений.