2011-11-17 74 views
3

在一個地方的代碼之後我做這樣的事情:AppEngine上 - 查詢數據庫,把東西

FormModel(.. some data here..).put() 

和幾行下面我從數據庫中選擇:

FormModel.all().filter(..).fetch(100) 

問題我注意到 - 有時候抓取並不會注意到我剛添加的數據。

我的理論是發生這種情況是因爲我使用高複製存儲,並且我沒有足夠的時間來複制數據。但是我怎樣才能避免這個問題呢?

回答

3

除非數據在同一個實體組中,否則無法保證數據將最高達數據(如果I understand this section正確)。

+0

謝謝。這似乎是原因。 – kolinko

+0

我會保持這個問題的一天,以防有人提供某種方式來等待申請/強制申請.. – kolinko

+0

@Merlin,是保持開放,這是一個非常無能的問題,我自己的項目,我沒有想要遷移到HRD,除非有這種解決方案。 –

2

Shay說得對:沒有辦法知道數據存儲何時準備好返回剛輸入的數據。

但是,你保證,一旦調用put成功完成數據將被輸入最終,。這是很多信息,你可以用它來解決這個問題。當你從fetch得到數據時,只需追加/插入你知道最終會在那裏的新實體!在大多數情況下,我認爲在每個請求的基礎上這樣做會很好,但是您可以做更強大的功能,使用memcache來覆蓋所有請求(除非memcache失敗)。

困難的部分,當然是搞清楚什麼時候應該追加/插入哪些實體。必須採取這種解決方法是令人厭惡的,但以相對較低的代價來支付與HRD一樣驚人複雜的事情。

+0

是啊,這是我的「B計劃」 - 我寧願更簡化的解決方案:) – kolinko

+0

我認爲這是現在存在的最佳解決方案。我可以想象一個庫自動掃描最近放置的實體以便包含在查詢中並得到結果,但我沒有聽說過它。 –

0

https://developers.google.com/appengine/docs/java/datastore/transactions#Java_Isolation_and_consistency

這種一致的快照視圖,還延伸到後讀取寫入 內部交易。與大多數數據庫不同,查詢並在數據存儲區事務中獲取 ,因此看不到在該事務中寫入的前 的結果。 具體來說,如果某個實體被修改爲 或在事務中被刪除,那麼查詢或獲取將返回原始的 版本的實體,如果該實體不存在,則返回該實體的版本號或 。