Причиной, по которой ваш текущий метод по-прежнему подвержен условиям гонки, является тот факт, что (не являющиеся предками) результаты запроса всегда в конечном итоге непротиворечивы.Даже если вы используете запросы предков (единственные запросы, разрешенные внутри транзакции), вы все равно, вероятно, столкнетесь с условиями гонки из-за модели изоляции и согласованности хранилища данных модель.
Как упоминает Алекс, единственнойспособ гарантировать уникальность состоит в том, чтобы использовать значение свойства в качестве идентификатора ключа сущности (вы бы проверяли существование ключа в вашем методе pre_put_hook
, см. TypeError с get_or_insert ).Но вы можете сделать это только для отдельного свойства для вида объекта и, в частности, для свойства адреса электронной почты, это не будет хорошей идеей, поскольку будет трудно обрабатывать изменения адреса электронной почты.
способы обеспечения уникальности, но допускающие временное / временное потенциально дублирующее условие, см. ndb проверить уникальность сущности в транзакции .