我有一个User包含Email字段的实体。该User实体ID是ULID,因为我想允许用户更改他们的电子邮件地址,但我想确保电子邮件地址是两个独特的CREATE和UPDATE。
User
Email
CREATE
UPDATE
我正在使用数据存储区交易。这是一个代码片段:
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.Transaction
GetAll
datastore.NewQuery("User").Filter("Email =", user.Email)
恐怕使用
client.GetAll(ctx, q, nil)
不能保证交易内的隔离。
简短的回答是“否”,除非您要查询特定的实体组,否则您不能将查询用作事务的一部分。全局查询始终总是一致的。但是,将所有内容放在单个实体组中可能会极大地限制写入吞吐量。
解决方法是您可以使用另一种带有将电子邮件地址映射到用户的实体的实体。然后,您可以在事务中检查电子邮件实体,如果它不存在或指向错误的位置,则将电子邮件实体和用户实体都设置为单个事务。