Изменения транзакции записи в ClientA сразу видны для чтения ClientB, начатого после COMMIT? - PullRequest
2 голосов
/ 05 марта 2020

Мы наблюдаем некоторые поведения / ошибки в некоторых наших рабочих процессах, связанные с согласованностью и видимостью транзакции записи Postgres, за которой следует чтение. Один из наших разработчиков предложил объяснение, но я не смог найти никаких результатов поиска, документирующих предлагаемое обоснование.

Для одного хоста Postgres 10.3 выполняются следующие операции:

  1. ClientA выполняет успешную транзакцию записи
  2. После COMMIT отправляется внешнее уведомление
  3. ClientB реагирует на внешнее уведомление и выполняет чтение только для того, чтобы обнаружить, что изменения транзакции UPDATE не видны

Было предложено объяснение, что два клиентских соединения postgres в разных потоках не имеют гарантированного снимка представления и могут не сразу наблюдать обновление транзакции записи после фиксации. Но из того, что я прочитал, я ожидал, что после успешного выполнения команды COMMIT операция чтения, а затем запуск в ответ, должны увидеть результаты этой записи.

Мой конкретный c вопрос: Учитывая два клиента базы данных соединения в разных потоках, возможно ли состояние состязания с одним клиентом, просматривающим эффекты транзакции записи ПОСЛЕ того, как другой клиент совершил? (без перекрывающихся транзакций).

Каждый фрагмент документации, который я нашел до сих пор, касается только вопросов о перекрывающихся / параллельных транзакциях и разделах MVCC / изоляции транзакций. Ничего о синхронизированной последовательной операции между двумя различными клиентскими подключениями.

Редактировать: некоторые дополнительные сведения о конфигурации. ClientA и ClientB будут разными потоками, получающими доступ к postgres через пул соединений. Оба клиента могут находиться в одном и том же пуле соединений на одном сервере приложений, или это могут быть ClientA / ApplicationA и ClientB / ApplicationB. Когда ClientB реагирует, он обращается к существующему пулу соединений с сервером приложений, чтобы выполнить новое чтение.

1 Ответ

1 голос
/ 06 марта 2020

Нет, этого не может произойти, если транзакция чтения не запущена ранее и не выполняется на уровне изоляции REPEATABLE READ или SERIALIZABLE.

Существует также вероятность того, что транзакция чтения не подключится к тот же сервер, что и транзакция записи, но на резервный сервер потоковой репликации с включенной hot_standby. Тогда это может легко произойти, даже с синхронной репликацией (если вы не установите synchronous_commit = remote_apply).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...