hostprofi.ru
Подобрать хостинг
Термин

Транзакция

краткое определение

Транзакция в БД — логически неделимая последовательность операций, подчиняющаяся принципам ACID. Гарантирует целостность данных: либо все изменения применяются, либо ни одно.

Транзакция в базе данных — логически неделимая последовательность операций, которая выполняется полностью или не выполняется вообще. Классический пример: банковский перевод. Два 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.

Другие термины