2012-03-02 57 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分配器不会键指定给一个新的实体,这将覆盖现有实体,所以一旦范围是填充有将不再是任何争。

因此,您不必担心新复制的实体将被覆盖。