「トランザクションの使用」の 2 番目の例を考えてみましょう (「名前付きキーでエンティティを更新するか、まだ存在しない場合は作成します」)。
https://developers.google.com/appengine/docs/java/datastore/transactions
ここで、このシナリオを考えてみましょう。マルチプレイヤー ゲームでは、任意の 2 人のプレイヤー間で 1 つの対戦のみが許可されます。これを確実にするために、各プレーヤーのキーを使用してキーが作成されます。このキーは、UniqueMatch エンティティのキーとして使用されます。
したがって、一致を作成するために、XG トランザクションが作成されます。このトランザクション内:
そのキーを持つ UniqueMatch エンティティがまだ存在しないかどうかを確認します。そのキーを使用した datastore.get() 呼び出しが EntityNotFoundException をスローしない場合、これら 2 人のプレイヤー間の一致が既に存在することがわかっているため、rollback() してプレイヤーにエラー メッセージを表示します。
一致を作成するために配置する必要があるすべてのエンティティを put() します。これには、UniqueMatch エンティティと、その他のいくつかのエンティティが含まれます。
その後、トランザクションがコミットされます。
これはうまくいくようです。ただし、短い時間枠内で任意の 2 人のプレイヤー間で 2 つのマッチを作成できることに気付きました。少しの間 (実際には、テストの 1 つで最大 10 ~ 20 秒)、datastore.get(key) への呼び出しで、そのキーが既に put() されているにもかかわらず、EntityNotFoundException がスローされます。
これは結果整合性のようです。しかし、キーによるエンティティの取得は、強い整合性が保証されているのではないでしょうか? この保証は、これが XG トランザクション内で行われるという事実によって影響を受けますか?
前もって感謝します、