Карта / SQL / Транзакции, ACID, уровни изоляции

Транзакции, 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) — увидеть данные другой транзакции, которая ещё не закоммичена и может откатиться. Неповторяющееся чтение — прочитал строку дважды в одной транзакции, а между чтениями её изменила другая транзакция, и значения разные. Чем выше уровень изоляции — тем больше гарантий, но и больше блокировок, а значит медленнее при высокой нагрузке.

🎤 Закрыл тему, если можешь объяснить:
• что такое транзакция и расшифровать ACID;
• разницу уровней изоляции и что такое грязное чтение (если дошёл до 3-го слоя).