Appengine ndb - 事务可以报告失败但成功

时间:2016-12-31 04:41:40

标签: google-app-engine transactions

在发现这个问题后,我对使用Appengine有些担忧: https://cloud.google.com/appengine/docs/python/datastore/transactions

  

注意:如果您的应用程序在提交时收到异常   交易,并不总是意味着交易失败。您   可以接收Timeout,TransactionFailedError或InternalError   在已经提交交易的情况下的例外情况   最终将成功应用。尽可能让你的   云数据存储交易是幂等的,如果你重复一次   交易,最终结果将是相同的。

Ndb交易: https://cloud.google.com/appengine/docs/python/ndb/transactions

这篇帖子之前已触及过这个主题但未回答: app engine datastore transaction exception

我搜索并了解了这个问题,但找不到更具体的内容。 我有一个游戏,我会做以下事情:

  • 注册
  • 登录
  • 更新进度
  • 更新密码/电子邮件
  • 删除帐户

因为一次只修改一个实体(更新进度或pw等)。将来我可能会添加多人游戏,因为它可能意味着一次更新多个实体。

如果我们从拥有的东西开始,我会看到一些问题。我需要准确理解事情是如何运作的。

  • 如果报告失败但实际上后来成功,这意味着什么? 假设进度已经成功保存,并且是12级。现在用户发布他/她进展到第15级。它报告失败但稍后成功。假设用户的兄弟在另一台设备上使用相同的配置文件,该设备仅在12级并且还没有看到其他更新,他完成了13级并保存。现在会发生什么? 交易包括读取保存的级别,如果它更大,则写入新的保留级别。 但是事务编号2会查看旧值,确定它应该写入13然后在事务1之后排队,以便事务1最终完成并写入15但事务2然后写入13因为它查看旧值? 或者,第一个事务会在实际写入和写入15之前读取值,然后事务2也将读取真实值,现在为15,然后不写入13? 提交交易意味着什么?
  • 对于注册,可能意味着注册被报告为失败但写入数据库,然后用户尝试再次注册,但服务器表示该电子邮件已存在。这会让人烦恼。
  • 更新电子邮件和密码 - 用户更新pw或电子邮件,并报告其失败。因此,他们使用旧的pw登录只是为了看到它不起作用,因为新密码实际上是写的,尽管它说失败了。这可以由用户使用“忘记密码”来解决,但它仍然非常烦人。

何时返回TransactionFailedError等异常?每次尝试后或仅在所有重试失败后?

是否有可能对所有这些的可能性进行某种估计?我的意思是,如果我有10个人使用它,我想它永远不会发生,一切似乎都有效,但后来我得到了一百万用户,事情开始在各处失败...... 如果这些问题每年一次发生在一百万用户中的一个,那么就不用担心了,但如果每个用户每周发生一次就会发生灾难。

0 个答案:

没有答案