ТранзакцииПродвинутый
Уровень изоляции
Определяет, насколько транзакция изолирована от изменений других транзакций.
Синтаксис
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 операций, выполняемых как единое целое: либо все успешно, либо ни одна.
Анекдоты по теме
DBA смотрит на лог: «Deadlock detected». — Кого убили? — Два UPDATE-а. Один держал стул, второй — стол. Никто не уступил. Пришлось убить обоих.
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.
Что общего между транзакцией и браком? И то, и другое надо коммитить, иначе всё откатится. Но в браке ROLLBACK стоит дороже.