Перейти к содержимому

26. Transactions & ACID

Atomicity, Consistency, Isolation, Durability.

Всё или ничего.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- Обе операции или ни одна

Данные всегда валидны.

ALTER TABLE accounts ADD CONSTRAINT positive_balance CHECK (balance >= 0);
-- Транзакция откатится, если баланс станет отрицательным

Транзакции не влияют друг на друга.

-- Transaction 1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- ещё не COMMIT
-- Transaction 2 не видит изменений Transaction 1
SELECT balance FROM accounts WHERE id = 1; -- старое значение

После COMMIT данные сохранены навсегда (даже при сбое).

-- READ UNCOMMITTED (самый слабый)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- READ COMMITTED (по умолчанию в PostgreSQL)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- SERIALIZABLE (самый строгий)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Следующий урок: Prisma ORM