SQLLab
Теория· 6 мин· 10 XP

Зачем нужны транзакции: сценарий без них

Представьте: система обработала первый UPDATE, но сервер упал до второго. Без транзакции это приводит к несогласованности данных.

Без транзакции — деньги пропали

sql
-- Шаг 1: деньги списаны ✓
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;

-- 💥 Сбой сервера

-- Шаг 2: деньги НЕ зачислены ✗
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;

После перезапуска: у Ивана −5000, у Марии без изменений. Деньги исчезли.

С транзакцией — всё или ничего

sql
BEGIN;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
-- 💥 Сбой сервера
-- PostgreSQL автоматически откатывает BEGIN...незавершённую транзакцию
-- После перезапуска: данные как до BEGIN

Транзакция гарантирует

  1. Если COMMIT прошёл — данные сохранены навсегда
  2. Если COMMIT не дошёл — всё откатывается, как будто ничего не было

Наш датасет

В таблицах accounts и transfers хранится результат транзакций:

  • status = 'committed' — транзакция зафиксирована, балансы изменились
  • status = 'rolled_back' — транзакция отменена, балансы не изменились
  • status = 'pending' — транзакция ещё не завершена

Прочитайте урок до конца — прогресс засчитается автоматически