Транзакции и ACID
транзакция объединяет несколько операций в атомарную единицу, которая либо выполняется полностью, либо не выполняется совсем.
Почему это важно: Без транзакций при сбое посередине операции данные окажутся в некорректном состоянии. Это критично для финансов, заказов, бронирований — любых данных, где важна целостность.
Главная идея
ACID — четыре свойства транзакций: Atomicity (всё или ничего), Consistency (данные остаются корректными), Isolation (транзакции не мешают друг другу), Durability (подтверждённые данные не теряются).
Как это выглядит на практике
- BEGIN начинает транзакцию.
- UPDATE accounts SET balance = balance - 100 WHERE id = 1 снимает деньги.
- UPDATE accounts SET balance = balance + 100 WHERE id = 2 зачисляет деньги.
- 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-фреймворки оборачивают операции в транзакции; важно понимать, где границы.
- Длинные транзакции удерживают блокировки и замедляют параллельные запросы.
Термины урока
Связь с работой backend-разработчика
В Rails ActiveRecord.transaction, в Django atomic() — это транзакции. Понимание их границ критично при сложных операциях: создании заказа, перводе средств, обновлении взаимосвязанных записей.
Мини-разбор реальной ситуации
Интернет-магазин: при оформлении заказа нужно уменьшить остаток товара и создать запись заказа. Без транзакции при сбое после уменьшения остатка заказ не создастся, но товар уже списан. С транзакцией — оба изменения атомарны.
Что запомнить
- Транзакции гарантируют целостность при сбоях.
- Держите транзакции как можно короче — длинные создают конкуренцию за блокировки.
- Понимайте, где ORM-фреймворк начинает и заканчивает транзакцию.
Итог
Транзакции и ACID — основа надёжности реляционных баз данных. Без них даже простые multi-step операции могут оставить данные в некорректном состоянии.