数据存储事务 - 达到实体写入限制
Datastore transaction - hitting entity write limit
问题
使用 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 多个实体的事务?
你无能为力。此限制由平台强制执行,以确保可扩展性和防止性能下降。您不能在单个事务中写入超过 500 个实体。
可以更改Google端的限制,但端则无能为力。
问题
使用 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 多个实体的事务?
你无能为力。此限制由平台强制执行,以确保可扩展性和防止性能下降。您不能在单个事务中写入超过 500 个实体。
可以更改Google端的限制,但端则无能为力。