トランザクションとインデポテンスを理解する助けが欲しいです。
注: トランザクションの送信時にアプリが例外を受け取った場合、必ずしもトランザクションが失敗したとは限りません。トランザクションがコミットされ、最終的に正常に適用される場合、Timeout、TransactionFailedError、または InternalError 例外を受け取ることができます。可能な限り、Datastore トランザクションをべき等にして、トランザクションを繰り返しても最終結果が同じになるようにします。
何か特別なことが起こったときにプレイヤーがメールを受け取るゲームがあります。プレイヤーが 2 つ (またはそれ以上) のメールを受け取ることがあるというバグがあります。これは、トランザクション内でゲームのルールを処理しているのに、外部でメールを送信しているためだと思います。
いくつかの擬似コード:
def game_update(orders_from_player):
emails_to_send = db.run_in_transaction(process_player_orders, orders_from_player)
for e in emails_to_send:
send_email(e)
トランザクションが衝突した場合、電子メールのリストが再度送信されることを期待すべきであるというのは本当ですか?
リクエスト全体が繰り返されるのか、それともトランザクション プロシージャの呼び出しだけなのか (この場合は process_player_orders)
よくわかりません。