Модульні уроки (1/4)
Транзакції ACID (BEGIN/COMMIT)
Основою надійності будь-якої бази даних є акронім ACID:
- Атомічність: операція або завершується повністю (Commit), або зазнає невдачі, не залишаючи слідів напіввиконаної роботи (Rollback).
- Cузгодженість: правила бази даних (наприклад, обмеження, зовнішні ключі) завжди дотримуються.
- Iізоляція: транзакції, що відбуваються одночасно, не заважають одна одній неконтрольованим чином.
- Dнадійність: після фіксації зміна безповоротно записується на диск.
Синтаксис транзакцій
Зазвичай кожен окремий запит UPDATE або DELETE розглядається як окрема транзакція (автокомміт). Але якщо ви хочете згрупувати кілька операцій разом, наприклад, списання коштів з рахунку клієнта та розміщення замовлення, вам потрібно зробити це явно за допомогою синтаксису транзакції.
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, яка надіслала запит, зрозуміє, що є проблема (наприклад, на складі недостатньо запасів, і вона аварійно завершує роботу), вона надішле:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockСпробуйте самі
Відкрийте транзакцію.\nОновіть продукт з ідентифікатором 10, встановивши для його «кількості» значення 0 у тимчасовій таблиці (не чекайте, «кількість» не вказано в продуктах, давайте винайдемо: змініть «ціну за одиницю» в «замовленні», але для цього потрібне обмеження.\nДавайте зробимо краще: оновіть статус замовлення з ідентифікатором 5 на «відправлено» та успішно завершіть транзакцію.
Показати підказку
Почніть з BEGIN;, змініть замовлення для id = 5 на status='shipped', потім надішліть його за допомогою COMMIT;
Рішення доступне після 3 спроб
Паніка на виробництві! Розробник написав DELETE без WHERE, історично видаливши всі відгуки.\nДавайте покажемо їм, як виконується відкат. Розпочніть транзакцію, запустіть швидкий DELETE, який стирає все з «відгуків» (без речення WHERE), але потім скористайтеся рятувальником SQL, щоб скасувати вплив перед завершенням блокування.
Показати підказку
BEGIN;, чисте видалення на «reviews», а потім магічний ROLLBACK; в кінці.
Рішення доступне після 3 спроб