2

是否有結果的差異,我可以從這段代碼期望:與此代碼Google Appengine數據存儲何時可以返回陳舊數據?

query = MyModel.all(keys_only=True).filter('myFlag', True) 
keys = list(query) 
models = db.get(keys) 

query = MyModel.all().filter('myFlag', True) 
models = list(query) 

即,將models在兩個一樣的嗎?

如果不是,爲什麼不呢?我曾認爲最終一致性用於描述模型的索引需要一段時間才能更新,因此可能與最近寫入的數據不一致。

但我最近的經歷:我其實是從查詢獲得舊數據,如第二個,其中model.myFlagTrue對通過查詢檢索到的模型,但False當我真正得到通過鑰匙模型的情況下。

那麼在那種情況下,myFlag的數據來自哪裏呢?

是否通過鍵獲取實體可確保跨數據存儲節點複製並返回最新數據,而通過查詢獲取它只是從最近的數據存儲節點檢索數據?

編輯: 我看了這篇文章,並假設雲存儲的工作方式相同的AppEngine上數據存儲時,回答我的問題是肯定的,實體查詢返回可能有過時的值。

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore#h.tf76fya5nqk8

+0

通過編輯你是正確的,如果你想擁有很強的一致性,總是去尋找關鍵或祖先的查詢。 @帕特里克科斯特洛把你覆蓋。 –

回答

2

是的,正如你所提到的查詢可能會返回過時的值。在進行查詢時,數據存儲選擇性能而不是一致性。

更深入:對於實體組,每個節點都有一個尚未應用的寫入日誌。當您執行讀取或祖先查詢時,所涉及的實體組首先應用了其日誌。但是,當您執行普通查詢時,結果可能來自任何實體組,因此實體組無法跟上。但要小心使用第一個代碼示例,但用於實際查找這些實體的索引可能不是最新的。所以很有可能不會得到所有與myFlag = True實體。如果您有興趣,我會建議您閱讀Megastore paper

相關問題