数据存储区:使用自动生成的密钥ID

时间:2018-10-11 16:34:16

标签: google-cloud-datastore datastore

我想运行以下算法(更像是javascript伪代码)

const transaction = datastore.transaction(); 
await transaction.run();
const parentKey = createKey(namespace, kind) // note that I leave the ID th be generated
await transaction.save(ancestorKey, parentEntity); 
const childKey = createKey(namepsace, kind, parentId, parentKind) // ??? 
await transaction.save (ChildKey, childEntity); 
await transaction.commit(); 

由于尚未提交parentEntity的初始保存,我如何知道parentId?

我想将其运行到单个事务中,这可以实现吗?

1 个答案:

答案 0 :(得分:1)

否,由于数据存储区的transaction isolation and consistency(强调我),因此无法实现:

  

此一致的快照视图也扩展为写入后读取   内部交易。与大多数数据库不同,查询和获取   在Cloud Datastore交易中看不到的结果   先前在该事务中进行写入。具体来说,如果一个实体是   在事务中修改或删除,查询或查找返回   实体开始的原始版本   交易,或如果实体不存在则不进行交易

根据您为什么实际上需要以事务方式完成这样的顺序,您可能可以通过这种方式获得某种等效的东西:

  • 通过事务创建父级
  • 在同一事务中还创建并transactionally enqueue并将其父键作为参数传递给它的推送任务队列-仅当事务成功时//当任务成功时,任务才入队
  • 在任务处理程序中(也进行事务处理)创建子实体-保证只发生一次

请注意,由于推送任务队列支持有限,并非所有GAE环境都支持这种方案。