http://www.postgresql.org/docs/9.2/static/transaction-iso.html
Режим повторяемого чтения обеспечивает строгую гарантию того, что каждая транзакция видит полностью стабильное представление базы данных. Тем не менее, это представление не всегда будет соответствовать последовательному (по одному) выполнению параллельных транзакций одного и того же уровня. Например, даже транзакция только для чтения на этом уровне может видеть контрольную запись, обновленную, чтобы показать, что пакет был завершен, но не увидеть одну из подробных записей, которая логически является частью пакета, потому что она прочитала более раннюю версию контрольной записи. , Попытки обеспечить выполнение бизнес-правил транзакциями, выполняющимися на этом уровне изоляции, вряд ли будут работать правильно без осторожного использования явных блокировок для блокировки конфликтующих транзакций.
Разве это не фантомное чтение, которое невозможно в режиме повторяющегося чтения?
В документации говорится, что запрос в повторяемой транзакции чтения видит моментальный снимок на момент начала транзакции, тогда как может быть возможно, чтобы запрос считывал противоречивые данные?
источник
Фантомные чтения (не путайте это с неповторяющимися чтениями) возможны на уровне изоляции «Повторяемое чтение» ... в принципе. Но поведение Postgresql де-факто, когда вы выбираете «Повторяемое чтение», сильнее стандартного (почти «сериализуемая» изоляция), так что фактически у вас не будет фантомного чтения. Документы :
Теперь, что насчет этого предостережения: «эта точка зрения не обязательно всегда будет соответствовать некоторому последовательному (по одному) выполнению параллельных транзакций одного и того же уровня»? Я думаю (я не уверен), что это означает, что это означает, что снимок «извне» (исправленный в начале транзакции) может в конечном итоге включать строки из других транзакций, но не включать некоторые другие строки из той же транзакции.
источник