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

Транзакції ACID (BEGIN/COMMIT)

Основою надійності будь-якої бази даних є акронім ACID:

  • Атомічність: операція або завершується повністю (Commit), або зазнає невдачі, не залишаючи слідів напіввиконаної роботи (Rollback).
  • Cузгодженість: правила бази даних (наприклад, обмеження, зовнішні ключі) завжди дотримуються.
  • Iізоляція: транзакції, що відбуваються одночасно, не заважають одна одній неконтрольованим чином.
  • Dнадійність: після фіксації зміна безповоротно записується на диск.

Синтаксис транзакцій

Зазвичай кожен окремий запит UPDATE або DELETE розглядається як окрема транзакція (автокомміт). Але якщо ви хочете згрупувати кілька операцій разом, наприклад, списання коштів з рахунку клієнта та розміщення замовлення, вам потрібно зробити це явно за допомогою синтаксису транзакції.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

Якщо під час цих складних виконання програма JavaScript, яка надіслала запит, зрозуміє, що є проблема (наприклад, на складі недостатньо запасів, і вона аварійно завершує роботу), вона надішле:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

Спробуйте самі

вправи#sql.m11.l1.e1
Спроби: 0Завантаження…

Відкрийте транзакцію.\nОновіть продукт з ідентифікатором 10, встановивши для його «кількості» значення 0 у тимчасовій таблиці (не чекайте, «кількість» не вказано в продуктах, давайте винайдемо: змініть «ціну за одиницю» в «замовленні», але для цього потрібне обмеження.\nДавайте зробимо краще: оновіть статус замовлення з ідентифікатором 5 на «відправлено» та успішно завершіть транзакцію.

Завантаження редактора…
Показати підказку

Почніть з BEGIN;, змініть замовлення для id = 5 на status='shipped', потім надішліть його за допомогою COMMIT;

Рішення доступне після 3 спроб

вправи#sql.m11.l1.e2
Спроби: 0Завантаження…

Паніка на виробництві! Розробник написав DELETE без WHERE, історично видаливши всі відгуки.\nДавайте покажемо їм, як виконується відкат. Розпочніть транзакцію, запустіть швидкий DELETE, який стирає все з «відгуків» (без речення WHERE), але потім скористайтеся рятувальником SQL, щоб скасувати вплив перед завершенням блокування.

Завантаження редактора…
Показати підказку

BEGIN;, чисте видалення на «reviews», а потім магічний ROLLBACK; в кінці.

Рішення доступне після 3 спроб