Транзакции в 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.
Проверьте себя
1. Что гарантирует свойство атомарности (Atomicity)?
Aданные шифруются
Bтранзакция выполняется целиком или не выполняется вовсе
Cзапросы ускоряются
Dстроки сортируются автоматически
2. Какая команда отменяет все изменения с начала транзакции?
ACOMMIT
BROLLBACK
CDELETE
DFLUSH
3. В каком движке MySQL работают транзакции?
AMyISAM
BInnoDB
Cв любом
DMEMORY
Поддержать проект