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

Транзакции и ACID — почему перевод денег не «зависает» наполовину.

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

Зачем нужны транзакции

Классический пример — перевод денег: списать у одного, зачислить другому. Если между двумя операциями случится сбой, деньги «испарятся» или «удвоятся». Транзакция гарантирует, что обе операции применятся вместе или не применятся вовсе.

CREATE TABLE accounts (id INTEGER PRIMARY KEY, owner TEXT, balance INTEGER);
INSERT INTO accounts (owner, balance) VALUES ('Аня', 1000), ('Борис', 500);

BEGIN;                                              -- начало транзакции
UPDATE accounts SET balance = balance - 200 WHERE owner = 'Аня';
UPDATE accounts SET balance = balance + 200 WHERE owner = 'Борис';
COMMIT;                                             -- фиксируем оба изменения разом

SELECT owner, balance FROM accounts ORDER BY owner;

Вывод:

Аня|800
Борис|700

Оба UPDATE внутри BEGIN ... COMMIT применились вместе: у Ани стало 800, у Бориса 700, сумма сохранилась. Если бы между ними произошёл сбой, ROLLBACK (или автоматический откат) вернул бы всё в исходное состояние — без «полупереводов».

Что означает ACID

БукваСвойствоСмысл
AAtomicity (атомарность)транзакция применяется целиком или не применяется вовсе
CConsistency (согласованность)база переходит из одного корректного состояния в другое, ограничения соблюдены
IIsolation (изоляция)параллельные транзакции не мешают друг другу, как будто идут по очереди
DDurability (надёжность)после COMMIT данные сохранены даже при сбое питания

ROLLBACK: отмена

Если что-то пошло не так, незавершённую транзакцию откатывают командой ROLLBACK — все изменения внутри неё отменяются, словно их не было:

CREATE TABLE accounts (id INTEGER PRIMARY KEY, owner TEXT, balance INTEGER);
INSERT INTO accounts (owner, balance) VALUES ('Аня', 1000);

BEGIN;
UPDATE accounts SET balance = balance - 999999 WHERE owner = 'Аня';  -- ошибочно
ROLLBACK;                                                            -- отменяем

SELECT owner, balance FROM accounts;

Вывод:

Аня|1000

Несмотря на ошибочный UPDATE, после ROLLBACK баланс снова 1000 — изменения внутри транзакции отменены. Это атомарность в действии.

Итог

  • Транзакция (BEGIN ... COMMIT) выполняет группу операций как единое целое.
  • ACID: Atomicity (всё или ничего), Consistency (корректность), Isolation (изоляция параллельных), Durability (сохранность после COMMIT).
  • ROLLBACK откатывает незавершённую транзакцию — частичных изменений не остаётся.
Проверьте себя
1. Что гарантирует транзакция?
AУскорение запросов
BГруппа операций применяется целиком или не применяется вовсе
CАвтоматическое создание индексов
DСжатие данных
2. Что означает буква I в ACID?
AIndex — индексация
BIsolation — параллельные транзакции не мешают друг другу
CIntegrity — целостность ключей
DInsert — вставка
3. Что делает ROLLBACK?
AФиксирует изменения
BОтменяет все изменения незавершённой транзакции
CСоздаёт резервную копию
DУскоряет COMMIT
Поддержать проект