3

私のグーグルアプリアプリケーションでは、ユーザーがいくつかの契約を購入するたびに、これらのイベントが実行されます(わかりやすくするために簡略化されています)。

  • user.cashが減少します
  • user.contractsは数だけ増加します
  • Contracts.current_priceが更新されます。
  • market.no_of_transactionsが1増加します。

rdmsでは、これらは同じトランザクション内に配置されます。Googleデータストアでは、複数のモデルのエンティティを同じトランザクションに含めることはできないと思います。

この問題への正しいアプローチは何ですか?書き込みが失敗した場合に、先行するすべての書き込みがロールバックされるようにするにはどうすればよいですか?

編集:私は明らかにエンティティグループを見逃しました。今、私はそれらがどのように使用されるかに関するいくつかのさらなる情報をいただければ幸いです。明確にするもう1つのポイントは、「トランザクションに必要な場合にのみエンティティグループを使用する。エンティティ間のその他の関係については、クエリで使用できるReferencePropertyプロパティとキー値を使用する」ということです。参照プロパティ(クエリを実行する必要があるため)と親子関係(トランザクションの場合)の両方を定義する必要があるということですか?

編集2:そして最後に、エンティティが2つの親の間にn対nの関係を確立するために作成されている場合、エンティティの2つの親をどのように定義しますか?

4

3 に答える 3

0

Datastore のドキュメントからの引用を追加させてください。

経験則として、エンティティ グループは、1 人のユーザーのデータに相当するサイズ以下にする必要があります。

疑似ルート エンティティを作成し、その下にすべてを配置できます。次に、すべてをトランザクションで実行します。

于 2010-01-24T15:15:31.470 に答える
0

shanyu さんは、単一のトランザクションで任意の数のエンティティ グループにわたって操作できる分散トランザクション レイヤーについて言及しました。それは実際 にリリースされましたが、大声で宣伝されていません。これは、ダニエル・ウィルカーソンとエリック・アームブラストによって設計および作成され、私の側でいくつかのコンサルティングを受けました。dan がこのトークで説明しています。

ニック・ジョンソンは 、あなたが説明したのと同様に、エンティティグループ全体で「転送」タイプの操作を行う方法についても説明しました。タピオカオームほど汎用的ではありませんが、よりシンプルで軽量です。

トランザクションが正常にコミットされた場合にのみタスクが追加されるように、データストア トランザクション内のキューにタスクを追加できる、関連する組み込み機能トランザクション タスクがあります。その後、そのタスクは、別のエンティティ グループでのトランザクションを含む、より多くのデータストア操作を実行できます。dan と erick のソリューションほど強力ではありませんが、エンティティ グループ全体で最終的な一貫性が保証されます。これは、余分なオーバーヘッドなしで、多くのユース ケースに十分対応できます。

あなたの質問に答えて: 1) 参照プロパティと親子関係 (つまり、エンティティ グループ) の両方を使用する必要はありません。このガイドラインは、エンティティ グループごとに書き込みがシリアル化されるため、エンティティ グループがデータストアの書き込みスループットを制限することを意味します。祖先クエリのためだけにデータをエンティティ グループに構造化することを検討している場合は、このことに注意してください。

2) エンティティは複数の親を持つことはできません。多対多の関係をモデル化する場合は、通常、参照プロパティ (キーなど) の ListProperty を使用する必要があります。詳細については、この記事この講演を参照してください。

于 2011-01-25T21:08:12.420 に答える
0

徹底的な調査の結果、単一エンティティ グループの制限に対するソリューションを提供する分散トランザクション レイヤーが、Google の一部の人々の助けを借りてユーザーランドで開発されていることがわかりました。ただし、これまでのところリリースされておらず、Java でのみ使用できます。

于 2009-05-08T09:15:20.220 に答える