【问题标题】:App Engine: create object inside a transactionApp Engine:在事务中创建对象
【发布时间】:2010-08-03 18:53:22
【问题描述】:

我正在编写一个关于 GAE-Java + Objectify 的站点,它允许用户创建自己的页面,具有唯一的 URL。我还没有找到一种明确的方法来确保当两个用户尝试同时声明相同的 url 时,只有一个用户可以得到它。

这是我要避免的:

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

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

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    为什么不在transaction 中运行您的代码?我看不出问题出在哪里。您有尝试过但遇到问题的示例吗?

    【讨论】:

    • 不...我真的无法测试这种情况。我不明白当用户 1 和 2 在各自的事务中运行时它会如何工作。
    • 实体组参与其中,即使您认为他们不参与。每个实体都隐含在一个实体组中,即使您没有明确地将它放在一个实体组中。并且任何交易只能涉及一个实体组中的实体。
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多