6

我想確認我對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) 

在這種情況下,邏輯告訴我我應該獲取內容的最新值,因爲通過密鑰讀取保證了一致性強。我很感激確認。

回答

9

情景1.是的,你的理解是正確的。

情景2.不,相同的查詢,所以仍然最終一致。

情景3.是的,你的理解是正確的。

此外,您可以通過在同一事務中做所有事情來避免最終的一致性,但當然這可能不適用。

+0

啊哈,謝謝,很有意思。因此,正常執行查詢和使用keys_only = True並從密鑰讀取之間存在差異。 – Luca

+0

是的,通過關鍵應該是一致的...但是,我有事務回滾的問題...(如果在提交語句失敗)它不總是工作(與JDO - Java)...我認爲我不是這樣做的錯誤..但認爲與本地谷歌代碼它應該工作! – headgrowe

相關問題