2012-03-02 55 views
3

我將實體從一種複製到另一種,並且想要以可預測的方式映射它們的long ID。映射結束後,我想要自動生成ID。AppEngine allocateIdRange:有關CONTENTION狀態的說明

爲了保護我複製的實體,我想使用allocateIdRange並手動分配每個ID,然後複製它。我希望這會導致數據存儲保護這些新的ID,並且只將其他ID分配給複製後創建的新實體。

一個返回代碼有我的擔心:CONTENTION

指示給定的KeyRange中是空的,但數據存儲區的自動ID 分配器可以在該範圍內分配新的實體按鍵。然而,它是 安全手動分配密鑰在這個範圍內,如果任一下列 的是真實的:

  1. 沒有其他請求將插入與同類實體和 家長爲給定的KeyRange中,直到與手動所有實體已編寫 這個範圍內的鍵。

  2. 覆蓋由其他請求使用與給定的KeyRange相同種類和父級寫入的實體是可以接受的。

2號是爲我。這些實體被覆蓋是不可接受的。

數字1我認爲是可以接受的,但措辭足夠嚇人,我想確保。如果我分配5個ID,從100104,並且我得到CONTENTION,這似乎表明我將複製的實體可能會被未來使用自動ID的新實體覆蓋。但是,如果我快速編寫自己的手動設置爲100,101,102,103和104的實體,我將是安全的,具有自動ID的新實體將不會收到這些ID。

我很擔心,因爲我不明白這是如何工作的。我不認爲id分配器關注寫入的內容。

TL; DR

試想以下情形:

allocateIdRange(100, 104); // returns CONTENTION 
putEntityWithManualId(100); 
putEntityWithManualId(101); 
putEntityWithManualId(102); 
putEntityWithManualId(103); 
putEntityWithManualId(104); 
// all puts succeed 

現在的時候,後來,我打電話

putNewEntityWithAutomaticId(); 

沒有任何風險,即自動編號爲100, 101,102,103或104?

回答

0

文檔如下波紋管:

數據存儲區的自動ID分配器不會鍵指定給一個新的實體,這將覆蓋現有實體,所以一旦範圍是填充有將不再是任何爭。

因此,您不必擔心新複製的實體將被覆蓋。