«Что такое транзакция и что значит 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.