ACID
Четыре свойства надёжных транзакций: Atomicity, Consistency, Isolation, Durability.
BEGIN; ... COMMIT; -- ACID гарантируется
Объяснение
Пример
-- Пример нарушения без транзакции: -- Списали деньги с одного счёта, сервер упал — деньги пропали. -- С транзакцией: BEGIN; UPDATE acc SET balance = balance - 500 WHERE id = 1; UPDATE acc SET balance = balance + 500 WHERE id = 2; COMMIT; -- оба UPDATE применятся, или ни один
Связанные термины
Анекдоты по теме
— Что такое freeze в PostgreSQL? — PostgreSQL использует 32-bit transaction ID (XID). После ~2 миллиардов транзакций — wraparound. — Что происходит? — Старые строки могут «исчезнуть». База уходит в read-only для безопасности. — VACUUM FREEZE? — Помечает строки как «вечные», освобождая XID пространство. — autovacuum следит за этим.
BEGIN; SELECT баланс FROM счёт WHERE id = 1; -- 1000₽ UPDATE счёт SET баланс = баланс - 1000 WHERE id = 1; UPDATE счёт SET баланс = баланс + 1000 WHERE id = 2; -- Сервер падает ROLLBACK; -- автоматически Деньги на месте. Вот почему транзакции.
— Что такое «потерянное обновление»? — Две транзакции читают одно значение, обе его изменяют, одно изменение теряется. — Пример? — Оба читают balance=100. Оба делают balance-10. Оба пишут 90. Должно быть 80. — Решение? — UPDATE balance = balance - 10 — атомарно. — Или SELECT FOR UPDATE. — Или SERIALIZABLE.