我有一个包含User
字段的Email
实体。 User
实体ID是ULID,因为我想允许用户更改其电子邮件地址,但我希望确保CREATE
和{UPDATE
上的电子邮件地址都是唯一的{1}}。
我正在使用数据存储区事务。这是一段代码片段:
ctx := context.Background()
k := datastore.NameKey("User", user.ID, nil)
_, err := client.RunInTransaction(ctx, func(t *datastore.Transaction) error {
// other stuff that needs to be in transaction
_, err = t.Put(k, user)
return err
})
return err
Email
字段已编入索引。有没有办法在User
实体中搜索当前用户的电子邮件地址作为交易的一部分?
*datastore.Transaction
没有GetAll
方法,所以我无法运行这样的查询:
datastore.NewQuery("User").Filter("Email =", user.Email)
我害怕使用
client.GetAll(ctx, q, nil)
不保证交易中的隔离。
答案 0 :(得分:3)
简短的回答是否定的,除非您要查询特定的实体组,否则不能将查询用作事务的一部分。全局查询总是最终一致的。但是,将所有内容放在单个实体组中可能会限制写入吞吐量过多。
解决方法是您可以使用另一种实体将电子邮件地址映射到用户。然后,您可以在交易中检查电子邮件实体,如果它不存在或指向错误的位置,请将电子邮件实体和用户实体全部设置为单个事务。