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

Ответ 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): Тоже легко. Пока ты в транзакции сидишь, кто-то строки добавит или удалит, и они у тебя в результатах то появятся, то исчезнут, как призраки, блядь.

Вот так вот, ебать мои старые костыли. Синтаксис есть, а толку — хуй с горы. Мартышлюшка одним словом.