2012-10-11 20 views
1

我試圖設計我的應用程序引擎數據存儲區代碼,並且已經考慮到了潛在的問題,並且無法在文檔中找到有關在給定情況下會發生什麼的任何具體信息。如果一個實體的祖先不存在,它會被創建(Java API)嗎?

當我去存儲具有祖先的實體時,在存儲它之前,我檢查並確保它的祖先存在於一個事務中,如果它不存在,我創建祖先。接下來,我開始另一個存儲實體的事務,它使用在上一步中找到或創建的祖先密鑰創建它。在用單用戶或極少用戶進行測試時,這並不會成爲一個問題,因爲儘可能少的併發修改機會,但是一旦部署完畢,我擔心的是,在第一個事務(創建/檢索祖先)和第二個事務(將一個實體添加爲祖先的後代),另一個用戶可能會刪除該祖先。

我最初的想法是將這一切都作爲一個事務出現,但在祖先不存在並且不得不被創建的情況下,祖先查詢來檢查我想創建的實體是否存在將因爲數據存儲的快照隔離模型。但是,我不確定這是否正確。

有沒有人對此事有任何認識?如果祖先被刪除,實體提交仍然可以使用現在指什麼都沒有的父鍵?這是否會重新創建父項,以便將來檢查它會返回相同的密鑰?我會測試這種情況,但我無法設計一種實際的方式來做到這一點。

回答

1

一個可能的解決方案可能是嘗試直接獲取祖先(而不是查詢),如果該對象爲空,則在事務中創建祖先和後代。這將模仿跨組交易(XG交易),因爲這兩個實體在創建時不屬於同一個實體組。

更多有關XG交易看一看:

希望這有助於!

+0

感謝您的意見。我會在今天看到這樣做,如果看起來很有希望,一定會回來接受答案。 – Jared

0

我相信答案是:「,它仍然會被創建」。

此行爲不應特定於Python或Java API。我嘗試創建一個實體,其中的密鑰擁有不存在的祖先,並且似乎可以在Google雲端數據存儲中使用。

我猜這背後的邏輯是基於數據存儲回答問題的過程:「該密鑰屬於哪個實體組?」我猜想通過檢查「頂級」祖先來做出決定,這意味着不管是否存在頂級祖先存在的鑰匙只有都無關緊要。

也就是說,如果Key.from_path('Kind1', 'parent')Key.from_path('Kind1', 'parent', 'Kind1', 'child')都要放在同一個實體組中(彼此獨立),那麼它們的添加順序是不相關的,並且第一個的存在與組無關第二個將住在哪裏。

一些示例代碼:

from gcloud.datastore import demo 
from gcloud.datastore.entity import Entity 
from gcloud.datastore.key import Key 

dataset = demo.get_dataset() 
entity = Entity() 
key = Key.from_path('Person', 'parent', 'Person', 'child').dataset(dataset) 
entity = entity.key(key) 
entity.save() 

注意,沒有 '父'(其中kind='Person', key_name='parent'不存在的實體)。

相關問題