Транзакции, ACID, уровни изоляции
Транзакция — группа операций с базой, которые выполняются как одно целое: либо все успешно, либо ни одной. Классический пример — перевод денег: списать с одного счёта и зачислить на другой должно произойти вместе, иначе деньги “потеряются” при сбое посередине.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- обе операции зафиксированы вместе
-- если что-то пошло не так — ROLLBACK; отменяет обе операции
ACID — четыре гарантии, которые даёт транзакция:
- Atomicity (атомарность) — всё или ничего, нет “наполовину выполненного” перевода;
- Consistency (согласованность) — после транзакции данные не нарушают ограничения (constraints);
- Isolation (изолированность) — параллельные транзакции не мешают друг другу;
- Durability (надёжность) — после
COMMITданные сохранены даже при сбое сервера сразу после.
Копнуть глубже
Уровни изоляции — компромисс между скоростью и точностью, когда несколько транзакций работают одновременно:
| Уровень | Защищает от | Цена |
|---|---|---|
READ UNCOMMITTED | ничего | самый быстрый, видны чужие незакоммиченные данные |
READ COMMITTED | ”грязного чтения” | по умолчанию в PostgreSQL |
REPEATABLE READ | + неповторяющегося чтения | данные не меняются в течение транзакции |
SERIALIZABLE | + фантомного чтения | самый надёжный, но самый медленный |
Грязное чтение (dirty read) — увидеть данные другой транзакции, которая ещё не закоммичена и может откатиться. Неповторяющееся чтение — прочитал строку дважды в одной транзакции, а между чтениями её изменила другая транзакция, и значения разные. Чем выше уровень изоляции — тем больше гарантий, но и больше блокировок, а значит медленнее при высокой нагрузке.
• разницу уровней изоляции и что такое грязное чтение (если дошёл до 3-го слоя).