Транзакция в базе данных — логически неделимая последовательность операций, которая выполняется полностью или не выполняется вообще. Классический пример: банковский перевод. Два UPDATE — списание и зачисление — должны выполниться одновременно. Сбой между ними без транзакции оставит деньги нигде.
ACID-свойства
- Atomicity (Атомарность)
- Либо все операции в транзакции выполнены, либо ни одна.
ROLLBACKотменяет все незафиксированные изменения. - Consistency (Консистентность)
- Транзакция переводит БД из одного корректного состояния в другое. Нарушение ограничений целостности (constraints, foreign keys) автоматически откатывает транзакцию.
- Isolation (Изоляция)
- Параллельные транзакции не видят незафиксированных изменений друг друга. Уровень изоляции определяет, какие аномалии допустимы.
- Durability (Долговечность)
- После
COMMITданные сохраняются даже при аварийном отключении питания. Обеспечивается WAL (Write-Ahead Log) — запись в журнал перед записью данных.
Уровни изоляции
| Уровень | Грязное чтение | Неповторимое чтение | Фантомы |
|---|---|---|---|
| Read Uncommitted | Возможно | Возможно | Возможны |
| Read Committed | Нет | Возможно | Возможны |
| Repeatable Read | Нет | Нет | Возможны |
| Serializable | Нет | Нет | Нет |
По умолчанию в MySQL/MariaDB — Repeatable Read. В PostgreSQL — Read Committed. Serializable — наивысший уровень безопасности, но наибольшие накладные расходы на блокировки.
Синтаксис транзакции
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- При ошибке:
-- ROLLBACK;
COMMIT;
Savepoint — промежуточная точка отката внутри транзакции:
BEGIN;
INSERT INTO orders (user_id) VALUES (1);
SAVEPOINT after_order;
INSERT INTO order_items (order_id, product_id) VALUES (LAST_INSERT_ID(), 5);
-- При ошибке в items — откат только до savepoint, не вся транзакция:
ROLLBACK TO SAVEPOINT after_order;
COMMIT;
История
Концепция транзакций разработана Джимом Греем (Jim Gray) в IBM в 1970-х годах. Статья Грея «Granularity of Locks and Degrees of Consistency» (1976) формализовала уровни изоляции. В 1998 году Джим Грей получил Тьюринговскую премию — в том числе за разработку теории транзакций и надёжных систем баз данных.
Транзакции в хостинге
На виртуальном хостинге движок MyISAM (MySQL) не поддерживал транзакции — это историческая причина проблем с консистентностью данных в старых WordPress-установках. С MariaDB 10.x InnoDB — движок по умолчанию, транзакции есть всегда. Репликация переносит транзакции с primary на реплики через binlog — атомарность сохраняется.
Распределённые транзакции
При микросервисной архитектуре данные разбросаны по нескольким базам данных. Классические ACID-транзакции не работают между разными СУБД. Паттерны решения: Saga (компенсирующие транзакции), Two-Phase Commit (2PC) — координирует коммит между несколькими участниками. 2PC — синхронный и медленный; Saga — асинхронный и сложный в реализации. В большинстве современных систем выбирают eventual consistency вместо строгого ACID.