Запросы Google Datastore и возможная согласованность
Я хотел бы подтвердить свое понимание возможной согласованности в хранилище данных 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", обновляю содержимое и записываю ее обратно. Например, предполагая, что у меня есть ключ "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)
В этом случае логика говорит мне, что я должен получить последнее значение содержимого, потому что чтение по ключу гарантирует строгую согласованность. Буду признателен за подтверждение.