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