Уроки модуля (1/4)
ACID-транзакции (BEGIN/COMMIT)
Основой надежности любой базы данных является аббревиатура ACID:
- Атомность: операция либо завершается полностью (Commit), либо завершается неудачей, не оставляя после себя следов наполовину выполненной работы (Откат).
- Cconsistency: правила базы данных (например, ограничения, внешние ключи) всегда соблюдаются.
- Iизоляция: транзакции, происходящие одновременно, не мешают друг другу неконтролируемым образом.
- Надежностьдолговечность: после фиксации изменение необратимо записывается на диск.
Синтаксис транзакции
Обычно каждый отдельный запрос 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 во временной таблице (нет, подождите, «количество» не относится к продуктам, давайте изобретем: измените «unit_price» в «order_items», но для этого требуется ограничение.\nДавайте сделаем лучше: обновите статус заказа с идентификатором 5 на «отправлен» и успешно завершите транзакцию.
Показать подсказку
Начните с BEGIN;, измените заказы для id = 5 на status='shipped', затем отправьте их с помощью COMMIT;
Решение доступно после 3 попыток
Паника на производстве! Разработчик написал DELETE без WHERE, исторически удалив все отзывы.\nДавайте покажем им, как выполняется откат. Запустите транзакцию, выполните быстрое DELETE, которое стирает все из «обзоров» (без предложения WHERE), но затем используйте спасательную операцию SQL, чтобы отменить воздействие до завершения блока.
Показать подсказку
BEGIN;, полное удаление «обзоров», а затем волшебный ROLLBACK; в конце.
Решение доступно после 3 попыток