Транзакции и 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
| Буква | Свойство | Смысл |
| A | Atomicity (атомарность) | транзакция применяется целиком или не применяется вовсе |
| C | Consistency (согласованность) | база переходит из одного корректного состояния в другое, ограничения соблюдены |
| I | Isolation (изоляция) | параллельные транзакции не мешают друг другу, как будто идут по очереди |
| D | Durability (надёжность) | после 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откатывает незавершённую транзакцию — частичных изменений не остаётся.