Поддерживает ли PostgreSQL уровень изоляции READ UNCOMMITTED?

Ответ

Формально, синтаксис для установки уровня изоляции READ UNCOMMITTED в PostgreSQL существует. Однако на практике он работает идентично уровню READ COMMITTED.

Почему так происходит?

Это связано с архитектурой PostgreSQL — MVCC (Multi-Version Concurrency Control). Благодаря MVCC, каждая транзакция видит только согласованный "снимок" (snapshot) данных, который не включает незафиксированные изменения других транзакций. Таким образом, «грязное чтение» (dirty read) — чтение не закоммиченных данных — в PostgreSQL в принципе невозможно.

Что это значит на практике?

Даже если вы выполните команду:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Ваша транзакция все равно не сможет прочитать данные, которые были изменены в другой, еще не завершенной транзакции. PostgreSQL внутренне "повышает" этот уровень до READ COMMITTED.

Феномены чтения в PostgreSQL при уровне READ COMMITTED / READ UNCOMMITTED:

  • Dirty Read (Грязное чтение): Невозможно. Вы никогда не увидите "грязные" данные.
  • Non-repeatable Read (Неповторяющееся чтение): Возможно. Если между двумя одинаковыми SELECT в вашей транзакции другая транзакция закоммитит изменения, вы получите разные результаты.
  • Phantom Read (Фантомное чтение): Возможно. Если другая транзакция добавит или удалит строки, они могут появиться или исчезнуть при повторном чтении в вашей транзакции.