【问题标题】:Sporadically datastore entry not updated偶尔数据存储条目未更新
【发布时间】:2020-12-14 08:04:17
【问题描述】:

在我的 python 应用程序中,通过 Web API 调用的函数正在向 NDB 数据存储表 sd 添加新条目。然后它更新表 cmpgn 中的当前条目以将引用附加到 sd 中的新条目。代码很简单:

sd = SendData(data=json_data)
sd.put()

cmpgn.send_data.append(sd.key)
cmpgn.put()

但是,对于 sd 中大约 50 个条目中的 1 个,缺少 cmpgn 中的引用。我在日志中没有发现任何错误。这种行为的原因可能是什么?

是否有可能在最后一个函数调用完成之前再次调用该函数以获得新的 sd 条目?

此应用仍在 Python 2.7 中运行。这会是个问题吗?迁移到 Python 3.x 会改变这种行为吗?

还有其他建议吗? Cloud Platform 中是否有工具可以分析行为?

【问题讨论】:

  • 查看数据存储事务以获得解决方案。您可能几乎同时有 2 个 API 调用,其中一个会覆盖另一个。
  • 非常感谢@gaefan。我想你搞定了。我最终使用了 threading.Lock() 因为我的 ndb 模型没有使用祖先查询。我认为只要我不在其他任何地方写 cmpgn.send_data,这也应该有效。
  • 斯特凡,不,那行不通。您需要使用事务。

标签: python google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

在您的情况下,有两个 API 调用来更新条目,Only the first transaction to commit its changes can succeed; all the others will fail to commit。事务有助于保持锁定。所以你不需要自己申请锁。但是,即使正在执行事务,backoff retry 仍然需要减少意外的 DB 操作失败。如果 I/O 很高,您可能需要考虑Transcation task queue 以避免事务超时。

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多