1

App Engineデータストアコードを設計しようとしていますが、潜在的な問題について考えましたが、特定の状況で何が起こるかについて、ドキュメントで具体的な情報を見つけることができませんでした。

祖先を持つエンティティを格納する場合、格納する前に、その祖先が1つのトランザクションに存在することを確認し、存在しない場合は祖先を作成します。次に、前の手順で見つかった、または作成された祖先キーを使用してエンティティを作成した、エンティティを格納する別のトランザクションを開始します。単一のユーザーまたはごく少数のユーザーでテストする場合、同時変更の可能性は最小限であるため、これが問題になることはありませんが、一度展開すると、最初のトランザクション(祖先の作成/取得)の間の時間に懸念があります。 )および2番目のトランザクション(祖先の子孫としてエンティティを追加する)では、別のユーザーが祖先を削除する可能性があります。

私の当初の考えは、これをすべて1つのトランザクションとして発生させることでしたが、祖先が存在せずに作成する必要がある場合、作成するエンティティが存在するかどうかを確認するための祖先クエリは、のスナップショット分離モデルのために失敗します。データストア。しかし、これが正しいかどうかはわかりません。

誰かがその問題について何か知識を持っていますか?祖先が削除された場合でも、エンティティのコミットは、現在は何も参照していない親キーで機能しますか?これにより親が再作成されるので、今後のチェックで同じキーが返されますか?私はこの状況をテストしますが、それを行うための実用的な方法を考案することはできません。

4

2 に答える 2

1

考えられる解決策は、(クエリではなく)祖先を直接取得しようとし、オブジェクトがnullの場合、トランザクション内に祖先と子孫の両方を作成することです。これは、作成時にこれら2つのエンティティが同じエンティティグループに属さないため、クロスグループトランザクション(XGトランザクション)を模倣します。

XGトランザクションの詳細については、以下を参照してください。

お役に立てれば!

于 2012-10-12T07:51:28.103 に答える
0

答えは「はい、まだ作成されます」だと思います。

この動作は、PythonまたはJavaAPIに固有のものであってはなりません。キーに存在しない祖先が含まれるエンティティを作成してみましたが、GoogleCloudDatastoreで機能しているようです。

この背後にあるロジックは、データストアが「このキーはどのエンティティグループに属しているか」という質問に答えるプロセスに基づいていると思います。決定は「トップレベル」の祖先をチェックすることによって行われると思います。つまり、トップレベルの祖先のみを持つキーが存在するかどうかは問題ではありません。

つまりKey.from_path('Kind1', 'parent')Key.from_path('Kind1', 'parent', 'Kind1', 'child')両方が同じエンティティグループに(互いに独立して)配置される場合、それらが追加される順序は無関係であり、最初の存在は2番目が存在するグループとは無関係です。

いくつかのサンプルコード:

from gcloud.datastore import demo
from gcloud.datastore.entity import Entity
from gcloud.datastore.key import Key

dataset = demo.get_dataset()
entity = Entity()
key = Key.from_path('Person', 'parent', 'Person', 'child').dataset(dataset)
entity = entity.key(key)
entity.save()

'親'(存在しkind='Person', key_name='parent'なかったエンティティ)がないことに注意してください。

于 2014-04-20T20:16:02.387 に答える