linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/MVCC и видимость/isolation-levels

kb/mvcc ── MVCC и видимость ── intermediate

Уровни изоляции в PostgreSQL

PostgreSQL различает три уровня изоляции. Read Committed (по умолчанию) берёт свежий снимок на каждый оператор. Repeatable Read берёт один снимок на транзакцию и держит его до конца. Serializable добавляет проверку, что транзакции можно выстроить в строгий порядок. Грязного чтения в PostgreSQL не бывает ни на одном уровне.

view as markdownaka: transaction-isolation, read-committed

Стандарт SQL описывает четыре уровня изоляции через аномалии, которые они запрещают. PostgreSQL реализует их строже стандарта: грязного чтения нет нигде, а Read Uncommitted ведёт себя как Read Committed. Реально различимы три уровня, и отличает их одно - когда берётся снимок (см. snapshot).

Три уровня и их снимки

УровеньСнимокЧто гарантирует сверх предыдущего
Read Committedновый на каждый операторвидит только зафиксированное
Repeatable Readодин на транзакциюповторное чтение неизменно
Serializableодин на транзакцию + проверкарезультат как при строгой очереди

Read Committed - уровень по умолчанию. Каждый оператор берёт свежий снимок, поэтому соседние SELECT в одной транзакции могут увидеть чужие свежие коммиты. Грязного (незафиксированного) он не покажет никогда.

Repeatable Read фиксирует снимок один раз, в начале первого запроса, и держит до конца транзакции. Сколько раз ни перечитывай - картина та же. В PostgreSQL этот уровень заодно убирает фантомные строки, чего стандарт не требует.

Serializable добавляет к снимку Repeatable Read проверку зависимостей между транзакциями. Подробности - в serializable-ssi.

Какие аномалии где возможны

АномалияRead CommittedRepeatable ReadSerializable
грязное чтениенетнетнет
неповторяющееся чтениеданетнет
фантомное чтениеданетнет
аномалия сериализациидаданет

Грязного чтения нет нигде - это особенность реализации PostgreSQL. Неповторяющееся и фантомное чтение отсекаются уже на Repeatable Read, потому что снимок заморожен. А вот аномалия сериализации (например, две транзакции, каждая читает то, что меняет другая) проходит даже на Repeatable Read - и ловится только на Serializable.

Цена за строгость: ошибка сериализации

За изоляцию выше Read Committed приходится платить. На Repeatable Read и Serializable конфликтующая запись не блокируется и не ждёт - транзакция откатывается с ошибкой 40001:

ERROR:  could not serialize access due to concurrent update

Это не сбой, а штатный сигнал «перепланируй и повтори транзакцию». Поэтому приложение на высоких уровнях изоляции обязано уметь повторять транзакцию при коде 40001. Кто меняет строку первым - тот и выигрывает; остальные получают ошибку и идут на второй круг.

Как переключать

sql
SHOW transaction_isolation;                          -- текущий уровень
BEGIN ISOLATION LEVEL REPEATABLE READ;               -- на одну транзакцию
SET default_transaction_isolation = 'repeatable read';  -- на сессию

§ команды

bash
SHOW transaction_isolation;

Уровень изоляции текущей транзакции

bash
BEGIN ISOLATION LEVEL REPEATABLE READ;

Открыть транзакцию с замороженным снимком на всю её длину

bash
BEGIN ISOLATION LEVEL SERIALIZABLE;

Самый строгий уровень: результат как при последовательном выполнении

§ см. также

  • snapshotСнимок данных (snapshot)Снимок - это не копия данных, а три числа: xmin, xmax и список активных xid между ними. Плюс правило, как по ним решать видимость версии. По снимку транзакция отделяет «прошлое» (зафиксировано до неё) от «настоящего» (идёт прямо сейчас) и «будущего» (ещё не начато). Дёшево по памяти, дорого по числу соединений.
  • serializable-ssiSerializable и SSISerializable в PostgreSQL построен на снимке Repeatable Read плюс отслеживание опасных зависимостей чтения-записи между транзакциями (SSI). Транзакции не блокируются: сервер запоминает, что они читали, через предикатные блокировки SIRead, и если складывается опасный цикл, откатывает одну с ошибкой 40001.
  • xmin-xmaxxmin, xmax и правила видимостиУ каждой версии строки два транзакционных штампа: xmin (кто вставил) и xmax (кто пометил устаревшей, 0 - если жива). Версия видна транзакции, если её xmin уже зафиксирован и попадает в снимок, а xmax либо пуст, либо ещё не зафиксирован, либо не виден снимку. По этим двум числам строится вся видимость.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки