我想確認我對Google數據存儲中最終一致性的理解。假設我有一個實體定義如下(採用NDB):Google數據存儲查詢和最終一致性
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)
在這種情況下,邏輯告訴我我應該獲取內容的最新值,因爲通過密鑰讀取保證了一致性強。我很感激確認。
啊哈,謝謝,很有意思。因此,正常執行查詢和使用keys_only = True並從密鑰讀取之間存在差異。 – Luca
是的,通過關鍵應該是一致的...但是,我有事務回滾的問題...(如果在提交語句失敗)它不總是工作(與JDO - Java)...我認爲我不是這樣做的錯誤..但認爲與本地谷歌代碼它應該工作! – headgrowe