Раздел 10 · Databases

Транзакции и ACID

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

«Что такое транзакция и что значит ACID?» задают на собеседованиях чаще любого другого вопроса о базах. Ответ «атомарность, согласованность, изоляция, долговечность» интервьюер слышит десятки раз и сразу просит пример. Подробная теория есть в уроках про ACID, уровни изоляции и блокировки и восстановление. Здесь мы собираем ответ с примерами на учебной базе и готовимся к уточнениям.

Как спрашивают

Что такое транзакция? Расшифруй ACID и приведи пример к каждой букве.

Следом почти всегда: «Какие бывают уровни изоляции? Какой по умолчанию в PostgreSQL?»

Короткий ответ

Транзакция это группа операций, которую база выполняет как одно целое: либо все изменения применяются, либо ни одного. ACID это четыре гарантии транзакции. Атомарность: всё или ничего, при ошибке изменения откатываются. Согласованность: после транзакции соблюдены все ограничения базы, ключи, CHECK, внешние ключи. Изоляция: параллельные транзакции не видят промежуточного состояния друг друга, а степень этой защиты задаёт уровень изоляции. Долговечность: после COMMIT данные переживут падение сервера, потому что изменения сначала пишутся в журнал. В PostgreSQL по умолчанию уровень Read Committed.

Разбор: перевод денег

Классический пример: перевод с одного счёта на другой. Это два действия: списать и зачислить. Если сервер упадёт между ними, деньги исчезнут. Транзакция склеивает два действия в одно.

В учебной базе счетов нет, поэтому возьмём повышение зарплаты всему отделу разработки:

BEGIN;
UPDATE employees SET salary = salary + 10000 WHERE department_id = 1;
SELECT name, salary FROM employees WHERE department_id = 1 ORDER BY id;
ROLLBACK;
name  | salary
------+-------
Анна  | 310000
Борис | 260000
Вера  | 260000

Внутри транзакции зарплаты выросли. После ROLLBACK повторный SELECT покажет прежние 300 000, 250 000 и 250 000: изменения не применились. Если бы вместо ROLLBACK стоял COMMIT, они применились бы все три сразу.

Пример к каждой букве

  • A, атомарность. Поменяй в примере выше второе действие на ошибочное, например UPDATE employees SET department_id = 99 WHERE id = 2: отдела 99 нет, и внешний ключ вернёт ошибку. В PostgreSQL после ошибки транзакция переходит в состояние сбоя, и COMMIT завершится откатом. Первое повышение тоже пропадёт.
  • C, согласованность. Тот же внешний ключ: база не даст записать сотрудника в несуществующий отдел ни внутри транзакции, ни вне её. Согласованность в ACID означает соблюдение правил, объявленных в схеме.
  • I, изоляция. Пока транзакция с повышением не зафиксирована, другая сессия видит старые зарплаты. Это защита от грязного чтения.
  • D, долговечность. После COMMIT база подтверждает запись только тогда, когда изменение попало в журнал на диске. Если сервер упадёт через секунду, при запуске он восстановит данные из журнала. Механизм журнала разобран в уроке про восстановление.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.