Конфликт базы данных GAE Push Queue во время запроса хранилища данных - PullRequest
1 голос
/ 18 октября 2019

Сводка У меня проблема с тем, что база данных записывает из моей очереди задач (примерно 60 задач со скоростью 10 / с) каким-то образом перезаписывается / удаляется во время одновременной базы данных прочитайте тех же данных. Я объясню, как это работает. Каждая задача в очереди задач назначает уникальный идентификатор конкретной сущности хранилища данных модели. Если я выполню индексированный запрос к хранилищу данных в модели и проведу циклы по объектам во время выполнения очереди задач, я ожидаю, что некоторые объекты будут обрабатываться очередью задач (т. Е. Назначать идентификатор), а другиееще предстоит осуществить. К сожалению, кажется, что происходит во время цикла по запросу, сущности, которые уже были обработаны (то есть .. успешно присвоены идентификаторы), перезаписываются или отбрасываются, говоря, что они никогда не обрабатывались, даже если - согласно моим журналам- они были прооперированы.

Почему это происходит? Мне нужно иметь возможность прочитать состояние моих данных, не влияя на операцию записи в очереди задач в фоновом режиме. Я подумал, что, возможно, это проблема с кэшированием, поэтому я попытался применить use_cache = False и use_memcache = False в запросе, но это не решило проблему. Любая помощь будет оценена.

Другие интересные примечания: Если я позволю полностью завершить очередь задач до того, как выполнит запрос к хранилищу данных, а затем выполнит запрос к хранилищу данных, он будет работать как ожидалось, и ничегоперезаписывается / отбрасывается

1 Ответ

1 голос
/ 19 октября 2019

Обычно это указание на то, что операции записи в объекты не выполняются в транзакциях. Транзакции могут обнаруживать такие параллельные операции записи (и чтения!) И повторять их, гарантируя, что данные остаются непротиворечивыми.

Вам также необходимо знать, что запросы (если они не являются запросами предков) в конечном итоге непротиворечивыэто означает, что их результаты немного «отстают» от фактической информации о хранилище данных (с момента обновления информации о хранилище данных требуется некоторое время, пока соответствующие индексы, используемые запросами, не будут обновлены соответствующим образом). Поэтому при обработке сущностей из результатов запроса вы также должны транзакционно проверять их содержимое. Лично я предпочитаю делать keys_only запросов , а затем получать сущности с помощью поиска ключей, которые всегда согласованы (конечно, также в транзакциях, если я собираюсь обновить сущности и, при необходимости, при чтении).

Например, если вы запрашиваете сущности, которые не имеют уникального идентификатора, вы можете получить сущности, которые на самом деле недавно были обработаны и имеют идентификатор. Поэтому вам следует (транзакционно) проверить, действительно ли у сущности есть идентификатор, и пропустить его обновление.

Также убедитесь, что вы не обновляете сущности, полученные из проекционных запросов - результаты, полученные из таких запросовможет не представлять целые объекты, их обратная запись уничтожит свойства, не включенные в проекцию.

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