我将实体从一种复制到另一种,并且想要以可预测的方式映射它们的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?