我將實體從一種複製到另一種,並且想要以可預測的方式映射它們的long
ID。映射結束後,我想要自動生成ID。AppEngine allocateIdRange:有關CONTENTION狀態的說明
爲了保護我複製的實體,我想使用allocateIdRange
並手動分配每個ID,然後複製它。我希望這會導致數據存儲保護這些新的ID,並且只將其他ID分配給複製後創建的新實體。
一個返回代碼有我的擔心:CONTENTION
指示給定的KeyRange中是空的,但數據存儲區的自動ID 分配器可以在該範圍內分配新的實體按鍵。然而,它是 安全手動分配密鑰在這個範圍內,如果任一下列 的是真實的:
沒有其他請求將插入與同類實體和 家長爲給定的KeyRange中,直到與手動所有實體已編寫 這個範圍內的鍵。
覆蓋由其他請求使用與給定的KeyRange相同種類和父級寫入的實體是可以接受的。
2號是爲我。這些實體被覆蓋是不可接受的。
數字1我認爲是可以接受的,但措辭足夠嚇人,我想確保。如果我分配5個ID,從100
到104
,並且我得到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?