Транзакции в InnoDB
Объединяем несколько изменений в одну неделимую операцию с помощью транзакций.
Транзакция — группа операций, которая выполняется целиком или не выполняется вовсе: промежуточного состояния «наполовину» не существует.
Классический пример: перевод денег
Перевод — это два действия: списать у одного, зачислить другому. Если между ними случится сбой, деньги «исчезнут». Транзакция гарантирует, что либо пройдут оба шага, либо ни одного.
START TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT; -- зафиксировать оба изменения разом
Если на любом шаге что-то пошло не так, вместо COMMIT выполняют ROLLBACK — и все изменения транзакции отменяются.
Команды
| Команда | Действие |
START TRANSACTION / BEGIN | начать транзакцию |
COMMIT | зафиксировать все изменения |
ROLLBACK | отменить все изменения с начала транзакции |
Важно: транзакции работают только в InnoDB. В MyISAM команды есть, но отката не происходит — ещё один довод за InnoDB.
Свойства ACID
Транзакции дают четыре гарантии (ACID):
- Atomicity (атомарность) — всё или ничего.
- Consistency (согласованность) — база переходит из одного корректного состояния в другое, ограничения соблюдаются.
- Isolation (изоляция) — параллельные транзакции не мешают друг другу видеть «грязные» промежуточные данные.
- Durability (долговечность) — после
COMMITданные не пропадут даже при сбое питания.
Идея на песочнице
SQLite тоже поддерживает транзакции. Покажем атомарность перевода: оба UPDATE в одной транзакции, затем COMMIT.
CREATE TABLE accounts (
id INTEGER PRIMARY KEY,
owner TEXT,
balance INTEGER
);
INSERT INTO accounts (owner, balance) VALUES ('Анна', 5000), ('Борис', 1000);
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;
SELECT owner, balance FROM accounts ORDER BY id;
Вывод:
owner balance Анна 4000 Борис 2000
Сумма на счетах сохранилась (6000): 1000 ушла от Анны к Борису одной неделимой операцией.
Итог
- Транзакция выполняется целиком (
COMMIT) или отменяется целиком (ROLLBACK). - Это спасает от «полусостояний» при сбоях — как в примере с переводом денег.
- Гарантии транзакций описывают свойства ACID.
- В MySQL транзакции работают только в InnoDB.