如何使用“Put”将密钥输入RunInTransaction,而不必等到事务发生之后

时间:2018-03-01 04:55:03

标签: google-app-engine go google-cloud-datastore datastore app-engine-flexible

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

这些部分是: Click here to see what represents each part enter image description here

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

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

所以,在两种情况下都应该考虑使用“client.RunInTransaction”方法为每个新数据做正常事情,所以我保证一切都很好,但这不可能,因为我无法获得“数据存储” .key“当将数据附加到数据存储区”client.RunInTransaction“时,文档说https://godoc.org/cloud.google.com/go/datastore#Transaction.Put(它返回* PendingKey没有密钥本身),我需要在”client.RunInTransaction“之外才能获得”数据存储区“。关键字“元素”和“提交”文档说https://godoc.org/cloud.google.com/go/datastore#Commit.Key

所以,我希望函数“put”进入“client.RunInTransaction”,当代码在“client.RunInTransaction”中时,给我关键元素,之后没有,所以我可以保证更新一切正常,因为如果我有密钥,下一个附加可能会失败,我不希望我的数据保存它

1 个答案:

答案 0 :(得分:1)

首先分别创建新数据实体,以获取其密钥。此时NextBlockdjango 1.11属性仍为空。

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