请帮我找到我的误解。应用程序引擎,交易和幂等性
我正在App Engine上撰写RPG。玩家采取的某些行动消耗某些属性。如果统计数字达到零,玩家可以不采取任何行动。然而,我开始担心作弊的球员,如果一名球员非常快速地发出两个动作,那么彼此相邻呢?如果减少属性的代码不在交易中,那么玩家有可能执行两次动作。所以,我应该包装在交易中减少stat的代码,对吧?到现在为止还挺好。
在GAE的Python,虽然,我们有这样的documentation:
注意:如果提交事务,当你的应用程序接收到一个例外,它并不总是 意味着该交易失败。如果事务已提交并且最终将成功应用 ,则可能会收到Timeout,TransactionFailedError或InternalError异常。只要有可能,使您的数据存储交易幂等 ,如果您重复交易,最终结果将是相同的。
哎呦。这意味着,我是跑的功能如下:
def decrement(player_key, value=5):
player = Player.get(player_key)
player.stat -= value
player.put()
嗯,这不是要去工作,因为事情是不是幂,对不对?如果我在它周围放置一个重试循环(是否需要使用Python?我读过,我不需要这么做,但是我无法在文档中找到它),它可能会增加两次值,对?由于我的代码可以捕获异常,但数据存储区仍然提交数据......呵?我该如何解决?这是我需要distributed transactions的情况吗?我真的吗?
嗯,是的,这是一个很好的观点......但在我用一堆难以诊断的,重现错误我想知道我应该在这里做什么模式。 – 2012-04-15 04:55:10
您的模式正处于正确的轨道上,但GAE有很多令人沮丧的细微差别,使得这种难以精确的手术操作成为可能。根据我对GAE的经验,有时候这是值得的,有时不值得。 – 2012-04-15 05:07:56
@TravisWebb不同意。交易安全性不是“过早优化”,交易冲突也不是特别不可能的。 – 2012-04-15 10:24:48