Перейти к основному содержимому
Модуль 8 · Урок 4 из 432/57 в курсе~10 min
Уроки модуля (4/4)

Транзакции: все или ничего

Транзакция – это группа операций, которые база данных рассматривает как единица: либо все добьются успеха, либо ни один из них не выйдет из строя. след. Так вы защитите себя от несоответствий, когда последовательность из UPDATE/INSERT/DELETE должны оставаться согласованными.

Синтаксис

SQL
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, которые должны выполниться вместе, никогда одно да, а другое нет.

SQL
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: отладчик администратора базы данных

SQL
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: частичный откат

Внутри транзакции можно создавать промежуточные точки:

SQL
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 не теряется даже в случае сбоя.

Ваша очередь

Упражнение#sql.m8.l4.e1
Попыток: 0Загрузка…

В одной транзакции: уменьшите на 1 запас продукта 1 и увеличьте на 1 запас продукта 2. Откройте с помощью BEGIN и закройте с помощью COMMIT.

Загрузка редактора…
Показать подсказку

Эталонный запас – 1 и акции +1 в соответствующих пунктах SET.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m8.l4.e2
Попыток: 0Загрузка…

Откройте транзакцию, попробуйте обновить город клиента с id=1 на «Sperimentale», затем отмените операцию с помощью ROLLBACK. В конце город клиента 1 должен быть исходным («Милан»).

Загрузка редактора…
Показать подсказку

ROLLBACK отменяет все изменения, сделанные начиная с BEGIN.

Решение доступно после 3 попыток