XG トランザクションは、最大 25 のエンティティグループに適用できます。祖先クエリはクエリを 1 つのエンティティ グループに制限し、1 つの XG トランザクションでこれら 25 のエンティティ グループ内でクエリを実行できます。
親のないトランザクション クエリでは、アプリケーション内のすべてのエンティティ グループが含まれる可能性があり、すべてがロックされるため、代わりにエラー メッセージが表示されます。
アプリ エンジンでは、通常、id が単調に増加するのを避けようとします。自動割り当てのものは、101、10001、10002 などのようになります。ID を単調に増やす必要があることがわかっていて、それがパフォーマンスの面でうまくいく場合は、次のようにします。
key_name の使用と直接検索を有効にするために、ある種の userId のモデル表現を用意します。
トランザクション外で userId を照会し、最上位の候補 ID を取得します
トランザクションで get_or_insert; を実行します。UserId.get_by_key_name(candidateid+1) を検索します。すでに存在し、別のユーザーを指している場合は、+2 などで再試行し、空いているユーザーを見つけて作成し、同時にユーザーのユーザー ID 属性を更新します。
UserId+User を更新する XG トランザクションが遅すぎる場合は、おそらく (XG ではなく) トランザクションで UserId+task を作成し、後で実行中のタスクに UserId と User を関連付けさせます。または、UserId の作成をシリアル化できる単一のバックエンドで、シーケンスの穴を回避し、1 秒あたり 50 回の作成などを再試行する場合は、おそらく put_async を許可します。
userName を key_name として使用できる場合は、クエリの代わりに直接ルックアップを実行して、処理を高速かつ安価にすることができます。