Google データストアの結果整合性について理解していることを確認したいと思います。次のように定義されたエンティティがあるとします (ndb を使用):
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」という名前の既存の Record を読み取り、コンテンツを更新して書き戻します。たとえば、このレコードのキー「k」があるとします。
r = k.get()
r.content = "new content"
r.put()
次に、シナリオ 1 と同じクエリを実行します。結果が得られたら、そのレコードが結果セットの一部であると想定します (たとえば、名前が "Luca" でキーが k のレコードが既にインデックスに含まれているため)。その場合、フィールド コンテンツが新しい値「新しいコンテンツ」を持つことが保証されますか? 言い換えれば、レコードを更新し、そのキーとインデックス付きフィールドをそのままにしておけば、最新の値を読み取ることが保証されますか?
シナリオ 3:シナリオ 2 と同様に行います。ここでも、k は「Luca」という名前のレコードのキーです。
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)
この場合、ロジックは、コンテンツの最新の値を取得する必要があることを教えてくれます。これは、キーによる読み取りによって強い一貫性が保証されるためです。ご確認いただければ幸いです。