【发布时间】:2022-01-23 17:19:22
【问题描述】:
问题
使用 golang cloud.google.com/go/datastore 包创建事务,执行一系列 getMulti 和 putMulti,在提交此事务时我遇到实体写入限制错误。
2021/12/22 09:07:18 err: rpc error: code = InvalidArgument desc = cannot write more than 500 entities in a single call
问题
我的问题是如何创建超过 500 次写入的事务?
虽然我希望我的操作保持原子性,但我似乎无法解决事务的写入限制错误,并且当我在模拟器上进行测试时,查询集运行良好,写入500个批次。
我的尝试
请原谅 sudo 代码,但我正试图了解我所做的事情 一体机
transaction, err := datastoreClient.NewTransaction(ctx)
transaction.PutMulti(allKeys, allEntities)
transaction.commit()
// err too many entities written in a single call
为了避免写入限制而进行批处理
transaction, err := datastoreClient.NewTransaction(ctx)
transaction.PutMulti(first500Keys, first500Entities)
transaction.PutMulti(second500Keys, second500Entities)
transaction.commit()
// err too many entities written in a single call
一个简单的常规 putmulti 也会失败
datastoreClient.PutMulti(ctx,allKeys, allEntities)
// err too many entities written in a single call
什么有效
对数据存储的非原子写入
datastoreClient.PutMulti(ctx,first500Keys, first500Entities)
datastoreClient.PutMulti(ctx,second500Keys, second500Entities)
这是我用于写入的真实代码,作为批处理事务或常规 putMulti
for i := 0; i < (len(allKeys) / 500); i++ {
var max int = (i + 1) * 500
if len(allKeys) < max {
max = len(allKeys) % 500
}
_, err = svc.dsClient.PutMulti(ctx, allKeys[i*500:max], allEntities[i*500:max])
if err != nil {
return
}
}
我迷路的地方
所以为了让我的工作保持原子性,是否有任何方法可以提交包含超过 500 个实体的事务?
【问题讨论】:
-
不要使用 Google Datastore,它有一些严重的设计缺陷。除了作为皇家供应商锁定它之外,它还不能跳过未知列。这意味着如果所有现有客户都立即中断,就无法安全地添加新列。
-
@rustyx 后视率往往是 20/20 :) 我正在继承这项工作,所以选择不是我也不是我,但我们的目标是过渡到不同的存储解决方案最终!
标签: go transactions datastore