TX2 сканирует таблицу и пытается заблокировать результаты.
Сканирование видит моментальный снимок базы данных с начала запроса, поэтому не может видеть вставленные строки(или получил право каким-либо иным способом) путем одновременных изменений, которые начались после того снимка.
Именно поэтому вы не можете видеть строку с id
2.
Для id
1, это также верно, поэтому сканирование находит эту строку.Но запрос должен ждать, пока не будет снята блокировка.Когда это, наконец, происходит, он выбирает последнюю зафиксированную версию строки и снова выполняет проверку, так что строка также исключается.
Эта повторная проверка «EvalPlanQual» (для использования жаргона PostgreSQL) выполняется только для строккоторые были найдены во время сканирования, но были заблокированы.Вторая строка даже не найдена во время сканирования, поэтому там такой обработки не происходит.
Это немного странно, допустим.Но это не ошибка, это просто способ PostgreSQL.
Если вы хотите избежать таких аномалий, используйте уровень изоляции REPEATABLE READ
.Тогда вы получите ошибку сериализации в таком случае и сможете повторить транзакцию, избегая подобных несоответствий.