如何使用 "Put" 获取密钥进入 RunInTransaction 而不是等到交易之后

How to get the key using "Put" into RunInTransaction without wait until after the transaction

我构建的数据库结构就像一条链,看起来像这样: Click here to see the structure

这些部分在哪里: Click here to see what represents each part

所以,当我想向我的链添加新数据时: Click here to see the new data coming ,在我想要的任何地方,我可以通过更新结构的 datastore.key 轻松更新它们的值:click here to see the update

所以,在这种情况下,我只需要更新 b.NextBlock、c.LastBlock、e.LastBlock 和 e.NextBlock 一切都很好,但假设我想添加更多新数据 Click her to see new data coming 如果有任何数据失败,我不想保存链条,我该怎么办?

所以,在这两种情况下,通常的想法是对每个新数据使用 "client.RunInTransaction" 方法,所以我保证一切都很好,但这不可能,因为我无法获得"datastore.key" 将数据附加到数据存储到 "client.RunInTransaction" 时,如文档所述 https://godoc.org/cloud.google.com/go/datastore#Transaction.Put (它 returns *PendingKey 本身没有密钥),我需要在 "client.RunInTransaction" 之外以便获取元素的 "datastore.key" 和 "commit",如文档所述 https://godoc.org/cloud.google.com/go/datastore#Commit.Key

所以,我想要 "put" 到 "client.RunInTransaction" 的函数,当代码在 "client.RunInTransaction" 里面时给我那个元素的键,没有之后,所以我可以保证一切都是好的更新,因为如果我之后有密钥,下一次附加可能会失败,我不希望我的数据保存它

首先单独创建新的数据实体,获取它的key。此时 LastBlockNextBlock 属性仍为空。

只有在您拥有实体的密钥后,才使用事务执行实体在列表中的插入,其中您仅更新该实体的密钥引用以及两者之间的前一个和下一个实体(如果有)要插入的实体。