App Engine:在事务中创建对象

时间:2010-08-03 18:53:22

标签: google-app-engine

我正在编写GAE-Java + Objectify网站,该网站允许用户使用唯一的URL创建自己的网页。我无法找到一种明确的方法来确保当两个用户同时尝试声明相同的网址时,只有一个用户可以获得它。

这是我要避免的:

  • 用户1进行检查 - 可用
  • 用户2进行检查 - 可用
  • 同时,用户1创建页面并存储它。
  • 用户2创建一个页面并覆盖用户1。

关于如何在GAE上解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

为什么不在transaction中运行代码?我不知道问题出在哪里。你有一些你尝试过但有问题的样品吗?

答案 1 :(得分:0)

python docs

中找到了更清晰的解释
  

尝试使用给定的密钥名称获取模型类型的实体。如果存在,get_or_insert()只返回它。如果它不存在,则创建,存储和返回具有kwds中给定种类,名称和参数的新实体。   get和后续(可能)put被包装在事务中以确保原子性。这意味着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)