数据存储事务 - 达到实体写入限制

Datastore transaction - hitting entity write limit

问题

使用 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端的限制,但端则无能为力。