登录
首页 >  Golang >  Go问答

遵守实体写入限制的数据存储事务

来源:stackoverflow

时间:2024-02-08 21:03:23 201浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《遵守实体写入限制的数据存储事务》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

问题

使用 golang cloud.google.com/go/datastore 包创建事务,执行一系列 getmultiputmulti,在提交此事务时,我遇到了实体写入限制错误。

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学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>