Средний ~30 мин чтения

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

Урок 6 из 6 в курсе SQL: быстрый старт

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

транзакция объединяет несколько операций в атомарную единицу, которая либо выполняется полностью, либо не выполняется совсем.

Почему это важно: Без транзакций при сбое посередине операции данные окажутся в некорректном состоянии. Это критично для финансов, заказов, бронирований — любых данных, где важна целостность.

Главная идея

ACID — четыре свойства транзакций: Atomicity (всё или ничего), Consistency (данные остаются корректными), Isolation (транзакции не мешают друг другу), Durability (подтверждённые данные не теряются).

Как это выглядит на практике

  1. BEGIN начинает транзакцию.
  2. UPDATE accounts SET balance = balance - 100 WHERE id = 1 снимает деньги.
  3. UPDATE accounts SET balance = balance + 100 WHERE id = 2 зачисляет деньги.
  4. COMMIT сохраняет оба изменения; если между ними произошла ошибка — ROLLBACK отменяет всё.

Что происходит под капотом

  • WAL (Write-Ahead Log) — механизм записи изменений в журнал до применения в данных; обеспечивает Durability.
  • MVCC (Multi-Version Concurrency Control) — каждая транзакция видит снимок данных; читатели не блокируют писателей.
  • Уровни изоляции (READ COMMITTED, REPEATABLE READ, SERIALIZABLE) управляют видимостью изменений между транзакциями.
  • Блокировки предотвращают конфликты при одновременном изменении одних строк.

Типичные ошибки и заблуждения

  • Ошибка: транзакции нужны только для финансовых операций. Любое действие, изменяющее связанные данные, выигрывает от транзакций.
  • Ошибка: BEGIN/COMMIT всегда явные. Большинство ORM оборачивают операции в транзакции автоматически.
  • Ошибка: транзакции замедляют БД. MVCC позволяет читать без блокировок — нагрузка минимальна.
  • Ошибка: ROLLBACK автоматически происходит при ошибке. В некоторых драйверах нужно явно вызвать ROLLBACK.

Ключевые выводы

  • Транзакция — атомарная единица: всё или ничего.
  • ACID-свойства гарантируют корректность данных при сбоях и параллельном доступе.
  • ORM-фреймворки оборачивают операции в транзакции; важно понимать, где границы.
  • Длинные транзакции удерживают блокировки и замедляют параллельные запросы.

Термины урока

Transaction: группа SQL-операций, выполняемых как единое целое.
COMMIT: подтверждение транзакции.
ROLLBACK: отмена всех изменений транзакции.
ACID: Atomicity, Consistency, Isolation, Durability.

Связь с работой backend-разработчика

В Rails ActiveRecord.transaction, в Django atomic() — это транзакции. Понимание их границ критично при сложных операциях: создании заказа, перводе средств, обновлении взаимосвязанных записей.

Мини-разбор реальной ситуации

Интернет-магазин: при оформлении заказа нужно уменьшить остаток товара и создать запись заказа. Без транзакции при сбое после уменьшения остатка заказ не создастся, но товар уже списан. С транзакцией — оба изменения атомарны.

Что запомнить

  • Транзакции гарантируют целостность при сбоях.
  • Держите транзакции как можно короче — длинные создают конкуренцию за блокировки.
  • Понимайте, где ORM-фреймворк начинает и заканчивает транзакцию.

Итог

Транзакции и ACID — основа надёжности реляционных баз данных. Без них даже простые multi-step операции могут оставить данные в некорректном состоянии.