Ответ
Формально, синтаксис для установки уровня изоляции 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 (Фантомное чтение): Возможно. Если другая транзакция добавит или удалит строки, они могут появиться или исчезнуть при повторном чтении в вашей транзакции.