0

我正在創建和編輯組。我需要檢查在創建具有該名稱的新組之前是否已經使用組名,或者將現有組名稱更改爲該名稱。appengine上的線程安全名稱保留

的問題是兩個並行的線程可以既爲組名在同一時間檢查,然後每一個線程可以繼續,並添加自己的組。重複的名字!

我不認爲我可以使用內置的事務,因爲這些羣體應該在不同的實體組和名稱不是關鍵的一部分。我能做什麼?

難道意義做出那種在關鍵使用組名稱指數的實體,這樣我可以做一個祖先查詢來獲取和創建原子的名字?創建索引實體的成功將作爲非事務代碼執行的權限。我希望有一個更簡單的解決方案,不需要一個全新的實體類型。

回答

1

的「指數單位」象你所說的是一個標準的方法來這一點,雖然我不知道你的意思使用祖先查詢什麼 - 索引實體既不應該是任何其他實體的孩子,也沒有任何兒童。

請記住這樣的交易影響:意外故障可能會導致被保留,但不使用名稱。

0

您可以使用Memcache解決方案而不是新實體嗎?你可能不得不定期清除它。

0

是否沒有辦法將組名(或基於名稱的散列)用作關鍵字?因爲+ group.get_or_insert(group_name)基本上可以解決你的問題。該方法自動在事務中運行,並使用該key_name創建或檢索實體。

+0

我使用'長'ID來引用客戶端的實體,這是非常根深蒂固的。當然,切換是一種選擇,並且可能比我的索引實體解決方案更容易(並且更具有缺陷)。謝謝你的提示。 – 2011-03-12 13:21:03

+0

@Riley'hashlib.sha256('my group name').hexdigest()'or'hashlib.sha256('my group name')。digest()。encode('base64')'會給你散列,可能是用作鍵,並且可以在客戶端使用(儘管它們會使你的URL變得更加糟糕)。 – Calvin 2011-03-12 16:49:57

+0

更好:'base64.urlsafe_b64encode(hashlib.sha256('my group name')。digest())。rstrip('=')' – Calvin 2011-03-12 17:06:39

0

你們真的認爲事務可以作爲線程鎖嗎?號

此外,爲了避免並行計算的環境下的競爭條件最好的辦法是,雖然,爲了避免衝突的寫入。也就是說,修改你的結構,延遲並將組名寫入到一個單獨的線程中。是的,它並不是實時的,但我懷疑你是否真的需要一個實時組名。請記住,如果你想要的不僅僅是一個玩具系統,還可以在任何地方使用不同步和擁抱不一致。