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

Транзакції: все або нічого

Транзакція – це група операцій, які розглядає база даних одна одиниця: або всі досягають успіху, або жоден із них не залишає a слід. Це те, як ви захищаєте себе від невідповідностей під час послідовності з 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 — база даних точно така, як це було раніше.

ТОЧКА ЗБЕРЕЖЕННЯ: частковий відкат

Всередині транзакції ви можете створити проміжні точки:

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:

  • Atomicity — все або нічого;
  • Cconsistency — обмеження залишаються задоволеними на початку та в кінці транзакції;
  • Isolation — одночасні транзакції не бачать проміжних станів (на різних «рівнях»);
  • Dнадійність — успішний 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 спроб