Модульні уроки (4/4)
Транзакції: все або нічого
Транзакція – це група операцій, які розглядає база даних
одна одиниця: або всі досягають успіху, або жоден із них не залишає a
слід. Це те, як ви захищаєте себе від невідповідностей під час послідовності
з 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 — база даних точно така, як
це було раніше.
ТОЧКА ЗБЕРЕЖЕННЯ: частковий відкат
Всередині транзакції ви можете створити проміжні точки:
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не втрачається навіть у разі збою.
Ваша черга
В одній транзакції: зменшити на 1 запас продукту 1 і збільшити на 1 запас продукту 2. Відкрийте за допомогою BEGIN і закрийте за допомогою COMMIT.
Показати підказку
Еталонний запас - 1 і запас + 1 у відповідних пунктах SET.
Рішення доступне після 3 спроб
Повторна вправа
Відкрийте транзакцію, спробуйте оновити місто клієнта з id=1 на «Sperimentale», а потім скасуйте операцію за допомогою ROLLBACK. Наприкінці місто клієнта 1 має бути оригінальним ("Мілано").
Показати підказку
ROLLBACK скасовує всі зміни, зроблені з BEGIN і далі.
Рішення доступне після 3 спроб