Ответ
Формально, синтаксис для установки уровня изоляции 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 (Фантомное чтение): Возможно. Если другая транзакция добавит или удалит строки, они могут появиться или исчезнуть при повторном чтении в вашей транзакции.
Ответ 18+ 🔞
Да ты послушай, что за дичь творится с этими уровнями изоляции в Постгресе! Ну формально-то, конечно, синтаксис для READ UNCOMMITTED есть, как же без него. Написал себе в транзакции:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
И сидишь такой, довольный, думаешь: "Щас я, сука, все грязные данные из соседней транзакции выцеплю, как охуенный хакер!" Ан хуй там плавал!
А на деле-то что выходит?
А выходит, что этот ваш READ UNCOMMITTED работает точь-в-точь как READ COMMITTED. Вообще ни хрена не отличается! Пиздец, да? Зачем тогда писать-то?
А вся соль, блядь, в ихней архитектуре — MVCC!
Multi-Version Concurrency Control, ёпта! Каждая транзакция видит свой собственный, блядь, "снимок" данных, который уже согласован. И в этот снимок никакие незакоммиченные изменения от других транзакций не пролезают. Вообще. В принципе. Так что "грязное чтение" (dirty read) в Постгресе — это как снег в июле, него ебать невозможно, хоть тресни!
Короче, практический вывод, чтоб ты понимал:
Какую бы хуйню ты ни написал про READ UNCOMMITTED, Постгрес внутри себя тихонько посмеётся и скажет: "О, ещё один умник нашёлся", — и повысит твой уровень до READ COMMITTED. Самовольно, сука!
И что же ты в итоге получишь на этих двух "разных" уровнях?
- Грязное чтение (Dirty Read): Забудь, нихуя не выйдет. Не увидишь ты чужие недоделанные данные, хоть лопни.
- Неповторяющееся чтение (Non-repeatable Read): Запросто! Сделал
SELECT, потом другой чувак закоммитил изменения и твой второй такой жеSELECTуже может вернуть другую хуйню. Вот такие дела. - Фантомное чтение (Phantom Read): Тоже легко. Пока ты в транзакции сидишь, кто-то строки добавит или удалит, и они у тебя в результатах то появятся, то исчезнут, как призраки, блядь.
Вот так вот, ебать мои старые костыли. Синтаксис есть, а толку — хуй с горы. Мартышлюшка одним словом.