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

ACID-транзакции (BEGIN/COMMIT)

Основой надежности любой базы данных является аббревиатура ACID:

  • Атомность: операция либо завершается полностью (Commit), либо завершается неудачей, не оставляя после себя следов наполовину выполненной работы (Откат).
  • Cconsistency: правила базы данных (например, ограничения, внешние ключи) всегда соблюдаются.
  • Iизоляция: транзакции, происходящие одновременно, не мешают друг другу неконтролируемым образом.
  • Надежностьдолговечность: после фиксации изменение необратимо записывается на диск.

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

Обычно каждый отдельный запрос 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 во временной таблице (нет, подождите, «количество» не относится к продуктам, давайте изобретем: измените «unit_price» в «order_items», но для этого требуется ограничение.\nДавайте сделаем лучше: обновите статус заказа с идентификатором 5 на «отправлен» и успешно завершите транзакцию.

Загрузка редактора…
Показать подсказку

Начните с BEGIN;, измените заказы для id = 5 на status='shipped', затем отправьте их с помощью COMMIT;

Решение доступно после 3 попыток

Упражнение#sql.m11.l1.e2
Попыток: 0Загрузка…

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

Загрузка редактора…
Показать подсказку

BEGIN;, полное удаление «обзоров», а затем волшебный ROLLBACK; в конце.

Решение доступно после 3 попыток