1

我是Google CloudDatastore的新手,正在閱讀文檔。
(注:我們不打算使用谷歌的AppEngine,只是數據存儲只)Google Cloud Datastore - 是否可以爲單個根實體使用事務?

按照document,數據存儲區支持事務,但

If you want to use queries within a transaction, 
your data must be organized into entity groups in such a way 
that you can specify ancestor filters that will match the right data. 

所以我想,只要我想用事務,我不得不創建一些父鍵,並將其設置爲祖先。父母的所有實體都有限制,即更新和事務只能每秒執行一次。

但是,我也看到插入的一個很簡單的例子,在這裏: https://cloud.google.com/datastore/docs/concepts/entities#datastore-insert-python

with client.transaction(): 
    incomplete_key = client.key('Task') 

    task = datastore.Entity(key=incomplete_key) 

    task.update({ 
     'category': 'Personal', 
     'done': False, 
     'priority': 4, 
     'description': 'Learn Cloud Datastore' 
    }) 

    client.put(task) 

它沒有指定父,並使用一個事務中一個根實體,不是嗎?甚至關於Transaction page中的示例,只有「只讀事務」的示例明確指定了父級。其他人在實際存在的情況下是否忽略父母?

我想知道我可以使用事務沒有實體組(=沒有大的性能下降),如果我可以指定一個根實體的關鍵,但在文件中沒有這樣的描述......

如果有人能夠澄清這一行爲,我將不勝感激。謝謝。

回答

1

交易確實允許(25個實體組per documentation的限制)

如果你想在交易中使用的查詢,

注意在這個關鍵句你引用的文字。它表示你想在事務內發出的任何'查詢'都需要作爲祖先查詢。這是因爲非祖先查詢最終是一致的,所以事務引擎不可能推斷任何狀態變化,因此不知道何時失敗或成功完成事務。這是而不是說你不能跨實體組進行交易。

它沒有指定父項並在 事務中使用單個根實體,是嗎?

我認爲這是混淆的另一個來源。只有子實體指定了父母來表示它們在哪個實體組中。當沒有指定父實體時,則的實體是根實體(它的父實體是根)。另一種說法是每個根實體都是它自己的實體組。

+0

這樣做是否合法? --- (0)通過密鑰查找某個根實體並檢查其'版本'屬性 (1)開始一個事務 (2)再次查找實體並檢查'版本'。 (3-a)如果'version'與(0)相同,則更新該值並繼續執行 (3-b),否則其他進程觸及該實體,則跳過該作業。 (4)提交事務--- 基本上我想要實現的一種樂觀鎖單個實體可以同時處理一些任務,在這種情況下想知道如果我還是要準備一些類型的祖先給每一個實體以執行上述交易。 –

+1

完全有效。作爲參考,我們的交易本身使用樂觀鎖定。如果你只是在讀寫,你不必擔心整個祖先的事情。它只考慮你是否在做SELECT/RunQuery。 –

+0

好的,謝謝你的信息!這聽起來可以將我們現有的MongoDB堆棧遷移到完全託管的DataStore。我感謝你的快速回應:) –

0

從技術上講,您的描述中的任務實體即使沒有子實體也構成實體組。允許的最大實體組數量爲25,因此如果嘗試使用此模式創建超過25個頂級實體,則查詢將失敗。

我避免性能命中的方式是使用多個實體組。我構建數據存儲庫,以便擁有多個根實體,並嘗試限制實體組中的多個事務。在多個實體組

+0

我有後臺工作人員,並希望確保一名工作人員處理工作時,沒有其他人冗餘處理同一工作。因此,如果我在DataStore中存儲了作業信息,那麼我只想在一個處理過程中鎖定作業實體。 我想我可以使用事務來達到這個目的(如果所有進程都試圖更新事務中的某個鎖定屬性,那麼只有第一個會成功)。但我認爲我可以將每項工作存儲爲根實體,但在閱讀完文檔後,我擔心如果需要構建每個實體的父級(合理分配),就像您一樣。 –

相關問題