Транзакции и ACID
Объедините несколько операторов в одну единицу работы по принципу "всё или ничего"
START TRANSACTION, вносят изменения и завершают её командой COMMIT, чтобы сохранить всё, или ROLLBACK, чтобы отменить всё. Именно так банк переводит деньги между двумя счетами, ни разу не теряя и не выдумывая ни одной копейки.
- открывать, сохранять и отменять работу с помощью
START TRANSACTION,COMMITиROLLBACK, - объяснять четыре гарантии ACID на примере банковского перевода,
- описывать, как
autocommitавтоматически оборачивает одиночные операторы, - точно предсказывать, что уцелеет при сбое оператора или обрыве соединения,
- использовать
SAVEPOINTдля отката только части транзакции.
1. Наша схема-пример: маленький банк
Каждый пример в этой теме использует одну небольшую таблицу accounts. Каждая строка - это счёт клиента с именем и текущим балансом. Мы применяем движок хранения InnoDB, потому что в MySQL только InnoDB поддерживает транзакции (старый движок MyISAM их игнорирует). Создайте и заполните таблицу один раз:
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
owner VARCHAR(40) NOT NULL,
balance DECIMAL(10,2) NOT NULL
) ENGINE = InnoDB;
INSERT INTO accounts (account_id, owner, balance) VALUES
(1, 'Alice', 500.00),
(2, 'Bob', 300.00),
(3, 'Carol', 1000.00);
Начальные данные выглядят так:
| account_id | owner | balance |
|---|---|---|
| 1 | Alice | 500.00 |
| 2 | Bob | 300.00 |
| 3 | Carol | 1000.00 |
Для денег мы намеренно берём DECIMAL(10,2): он хранит точные значения, в отличие от FLOAT, который внёс бы ошибки округления, совершенно недопустимые рядом с банковским балансом.