ТранзакцииСредний
Транзакция (TRANSACTION)
Группа SQL операций, выполняемых как единое целое: либо все успешно, либо ни одна.
Синтаксис
BEGIN; -- операции COMMIT; -- или ROLLBACK;
Объяснение
Транзакция гарантирует свойства ACID:
- Atomicity: всё или ничего
- Consistency: база остаётся в корректном состоянии
- Isolation: транзакции не видят незакоммиченных изменений друг друга
- Durability: после COMMIT данные сохранены
В PostgreSQL каждый отдельный запрос автоматически в транзакции (autocommit).
Пример
-- Перевод денег между счетами BEGIN; UPDATE accounts SET balance = balance - 1000 WHERE id = 1; UPDATE accounts SET balance = balance + 1000 WHERE id = 2; COMMIT; -- Если что-то пошло не так: -- ROLLBACK;
Связанные термины
ACIDЧетыре свойства надёжных транзакций: Atomicity, Consistency, Isolation, Durability.Deadlock (взаимная блокировка)Ситуация, когда две транзакции ждут блокировок друг друга и не могут продолжить.SAVEPOINTТочка сохранения внутри транзакции. Позволяет откатиться к ней, не отменяя всю транзакцию.Уровень изоляцииОпределяет, насколько транзакция изолирована от изменений других транзакций.
Анекдоты по теме
BEGIN; SELECT баланс FROM счёт WHERE id = 1; -- 1000₽ UPDATE счёт SET баланс = баланс - 1000 WHERE id = 1; UPDATE счёт SET баланс = баланс + 1000 WHERE id = 2; -- Сервер падает ROLLBACK; -- автоматически Деньги на месте. Вот почему транзакции.
Программист написал DELETE без WHERE. Через секунду он уже писал резюме.
— Что такое upsert? — INSERT, который превращается в UPDATE при конфликте. — Пример? — INSERT INTO counters (key, value) VALUES ('hits', 1) ON CONFLICT (key) DO UPDATE SET value = counters.value + 1; — Атомарный счётчик? — Именно.