Уровень изоляции
Определяет, насколько транзакция изолирована от изменений других транзакций.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- или: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Объяснение
Пример
-- Для финансовых операций BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT balance FROM accounts WHERE id = 1; -- 1000 -- Другая транзакция НЕ может изменить это значение UPDATE accounts SET balance = balance - 100 WHERE id = 1; COMMIT;
Связанные термины
Анекдоты по теме
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.
— Что такое Hot standby feedback? — Механизм, когда replica сообщает primary какие XID ещё нужны. — Зачем? — Предотвращает отмену запросов на реплике из-за VACUUM на primary. — Без этого? — Длинный запрос на реплике прерывается: 'ERROR: canceling statement due to conflict with recovery'. — Включить: hot_standby_feedback = on в postgresql.conf на replica.
FOR UPDATE — это как поставить стикер «занято» на строку. SELECT * FROM seats WHERE id = 1 FOR UPDATE; Другая транзакция тоже хочет эту строку? Пусть подождёт. COMMIT — стикер снят. DEADLOCK — оба ждут друг друга. Один проигрывает.