请帮我找出我的误解。
我正在 App Engine 上编写 RPG。玩家采取的某些行动会消耗一定的统计数据。如果统计数据达到零,则玩家不能再采取任何行动。不过,我开始担心作弊玩家——如果玩家非常快速地发送两个动作,紧挨着对方怎么办?如果减少统计数据的代码不在事务中,则玩家有机会执行该操作两次。所以,我应该将减少统计数据的代码包装在事务中,对吗?到目前为止,一切都很好。
但是,在 GAE Python 中,我们在文档中有这样的内容:
注意:如果您的应用在提交交易时收到异常,并不总是意味着交易失败。在事务已提交并最终将成功应用的情况下,您可能会收到 Timeout、TransactionFailedError 或 InternalError 异常。尽可能使您的数据存储事务具有幂等性,这样如果您重复事务,最终结果将是相同的。
哎呀。这意味着我正在运行的函数如下所示:
def decrement(player_key, value=5):
player = Player.get(player_key)
player.stat -= value
player.put()
好吧,那是行不通的,因为这东西不是幂等的,对吧?如果我在它周围放置一个重试循环(我需要在 Python 中这样做吗?我已经读过我不需要在 SO 上这样做......但我在文档中找不到它)它可能会将该值增加两次,正确的?由于我的代码可以捕获异常,但数据存储仍然提交了数据……嗯?我该如何解决?这是我需要分布式事务的情况吗?我真的吗?