App Engine: создать объект внутри транзакции - PullRequest
0 голосов
/ 03 августа 2010

Я пишу сайт на GAE-Java + Objectify, который позволяет пользователям создавать свои собственные страницы с уникальным URL. Я не смог найти четкого способа гарантировать, что когда два пользователя пытаются запросить один и тот же URL-адрес одновременно, его получает только один пользователь.

Вот чего я стараюсь избегать:

  • Пользователь 1 делает проверку - он доступен
  • Пользователь 2 делает проверку - он доступен
  • Тем временем Пользователь 1 создает страницу и сохраняет ее.
  • Пользователь 2 создает страницу и перезаписывает Пользователь 1.

Есть идеи, как решить эту проблему на GAE?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Почему бы просто не запустить свой код в транзакции ? Я не вижу, где проблема. У вас есть образец того, что вы пробовали и у вас были проблемы?

0 голосов
/ 03 августа 2010

Нашел более четкое объяснение в документах python :

Попытки получить сущность типа модели с заданным именем ключа.Если он существует, get_or_insert () просто возвращает его.Если он не существует, новый объект с заданным видом, именем и параметрами в kwds создается, сохраняется и возвращается.Получение и последующее (возможное) размещение заключаются в транзакцию для обеспечения атомарности.Это означает, что get_or_insert () никогда не будет перезаписывать существующую сущность и будет вставлять новую сущность тогда и только тогда, когда не существует сущности с данным видом и именем.Другими словами, get_or_insert () эквивалентен этому коду Python:

def txn():
  entity = MyModel.get_by_key_name(key_name, parent=kwds.get('parent'))
  if entity is None:
    entity = MyModel(key_name=key_name, **kwds)
    entity.put()
  return entity

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