6

Googleデータストアの最終的な整合性について私が理解していることを確認したいと思います。私は(NDBを使用して)次のように定義されたエンティティがあるとします。Google Datastoreのクエリと最終的な一貫性

class Record(ndb.Model): 
    name = ndb.StringProperty() 
    content = ndb.BlobProperty() 

私はシナリオ1を理解すると思うが、私はシナリオ2と3について疑問を持っているので、いくつかのアドバイスは非常にいただければ幸いです。

シナリオ1:名前「Luca」と指定された内容の新しいレコードを挿入します。私は原因結果整合性に、ちょうど、挿入されたレコードは、結果セットの一部ではないかもしれない、ということを理解

qry = Record.query(name=="Luca") 
for r in qry.iter(): 
    logger.info("I got this content: %r" % r.content) 

:その後、私は、データストアを照会します。必要に応じて先に来るために祖先クエリを使用することについて知っています。

シナリオ2:名前が "Luca"の既存のレコードを読み取り、内容を更新して書き戻します。例えば、私はこのレコードのキー「K」を持っていると仮定すると:私は結果を取得すると

r = k.get() 
r.content = "new content" 
r.put() 

その後、私はレコードが結果セットの一部であると仮定し、シナリオ1と同様のクエリを実行します(たとえば、索引にすでに名前「Luca」およびキーkのレコードが含まれていたため)。フィールドコンテンツの新しい価値「新しいコンテンツ」が保証されますか? つまり、レコードを更新し、そのキーとインデックスフィールドだけを残しておくと、最新の値を確実に読み取ることができますか?

シナリオ3:私はシナリオ2と同様に行い、再びkは名前を持つレコードのキー「ルカ」です:

r = k.get() 
r.content = "new content" 
r.put() 

が、その後、私は、クエリの修正バージョンを実行します。

qry = Record.query(name=="Luca") 
for k in qry.iter(keys_only=True): 
    r = k.get() 
    logger.info("I got this content: %r" % r.content) 

この場合、キーで読み取ると強い一貫性が保証されるため、ロジックで最新の値を取得する必要があります。私は確認を感謝します。

答えて

9

シナリオ1はい、ご理解の方が正しいです。

シナリオ2いいえ、同じクエリです。したがって、最終的に一貫しています。

シナリオ3はい、ご理解は正しいです。

また、同じトランザクション内のすべてを行うことで最終的な一貫性を避けることができますが、もちろんこれは当てはまりません。

+0

ああ、ありがとう、非常に興味深い。したがって、通常はクエリを実行し、keys_only = Trueでそれを実行してからキーから読み取るのには違いがあります。 – Luca

+0

はい、キーを一貫していなければなりません...しかし、私はトランザクションのロールバックに問題がありました...(コミットステートメントで何かが失敗した場合)常に(JDO - Javaで)動作していない...私は思います私はそれを間違っているわけではありませんが、それは動作するネイティブのGoogleコードと思う! – headgrowe