【发布时间】:2013-06-22 21:22:01
【问题描述】:
今天早上,我的 GAE 应用程序生成了几个错误日志:“这些数据存储实体的争用过多。请重试。”。在我看来,只有当多个请求尝试修改同一个实体或同一个实体组中的实体时,才会发生这种类型的错误。
当我收到此错误时,我的代码正在插入新实体。我糊涂了。这是否意味着我们创建新实体的速度会受到限制?
我的模型定义和调用顺序代码如下:
# model defnition
class ExternalAPIStats(ndb.Model):
uid = ndb.StringProperty()
api = ndb.StringProperty()
start_at = ndb.DateTimeProperty(auto_now_add=True)
end_at = ndb.DateTimeProperty()
# calling sequence
stats = ExternalAPIStats(userid=current_uid, api="eapi:hr:get_by_id", start_at=start_at, end_at=end_at)
stats.put() # **too much contention** happen here
这对我来说很神秘。我想知道我将如何处理这个问题。如果有任何建议,请告诉我。
【问题讨论】:
-
我有同样的问题。我正在使用管道。我在运行管道时
put()一个新实体。我的代码未包含在事务中(无论如何都不是我自己制作的),但我put的行显示为TransactionFailedError(too much contention on these datastore entities. please try again.)我无法在文档中找到此行为的解释 -
我只是注意到这是对一个已有一年的问题的新赏金。 :) Anentropic,您是否使用具有共同祖先的键创建实体?在同一个实体组中创建新实体相当于对同一个组进行并发更改,即使您没有使用显式事务,这些也会竞争访问。 (如果没有显式事务,则每个操作都在其自己的隐式事务中。)如果您不相信您在键中使用了共同的祖先,您可以发布您的代码,可能是一个新问题吗?
-
@DanSanderson 实际上我是,我以为我不是,但事实证明我是。不过,由于“热平板电脑”问题,似乎仍然有可能获得 OP 所描述的那种争论......我发现 Bruyere 发布的那篇文章作为答案,它也被埋在某个地方的文档中
-
哦,我看到你已经回复了 :)
-
是的,我找人确认了争用错误严格来说是关于争用的,热平板电脑会导致缓慢或可能超时。很高兴它成功了!
标签: python google-app-engine google-cloud-datastore