Уроки модуля (4/4)
Транзакции: все или ничего
Транзакция – это группа операций, которые база данных рассматривает как
единица: либо все добьются успеха, либо ни один из них не выйдет из строя.
след. Так вы защитите себя от несоответствий, когда последовательность
из UPDATE/INSERT/DELETE должны оставаться согласованными.
Синтаксис
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseВсе между BEGIN и COMMIT является атомарным: никаких других связей.
видит промежуточное состояние. Если программа выходит из строя или выполняется
ROLLBACK база данных останется такой же, какой она была до BEGIN.
Классический сценарий: трансфер
Канонический пример — перемещение запасов между продуктами (или денежный обмен).
перенос между учетными записями): два UPDATE, которые должны выполниться вместе,
никогда одно да, а другое нет.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;Если второй UPDATE завершается неудачей (например, ошибка ограничения CHECK),
ROLLBACK восстанавливает запас продукта 1 до исходного значения.
ROLLBACK: отладчик администратора базы данных
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Очень полезный шаблон для опробования UPDATE на реальных данных: вы
запустите его, проверьте результат с помощью SELECT в той же транзакции и
если это вас не убедит, вы ROLLBACK — база данных точно такая же
это было раньше.
SAVEPOINT: частичный откат
Внутри транзакции можно создавать промежуточные точки:
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermatoКИСЛОТА за 30 секунд
Транзакции гарантируют свойства ACID:
- Атомичность — всё или ничего;
- Cconsistency — ограничения остаются удовлетворенными в начале и в конце транзакции;
- Isolation — параллельные транзакции не видят промежуточных состояний (на различных «уровнях»);
- Надежностьдолговечность — успешный
COMMITне теряется даже в случае сбоя.
Ваша очередь
В одной транзакции: уменьшите на 1 запас продукта 1 и увеличьте на 1 запас продукта 2. Откройте с помощью BEGIN и закройте с помощью COMMIT.
Показать подсказку
Эталонный запас – 1 и акции +1 в соответствующих пунктах SET.
Решение доступно после 3 попыток
Обзор упражнения
Откройте транзакцию, попробуйте обновить город клиента с id=1 на «Sperimentale», затем отмените операцию с помощью ROLLBACK. В конце город клиента 1 должен быть исходным («Милан»).
Показать подсказку
ROLLBACK отменяет все изменения, сделанные начиная с BEGIN.
Решение доступно после 3 попыток