請幫我找到我的誤解。應用程序引擎,交易和冪等性
我正在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