問題
使用 golangcloud.google.com/go/datastore包創建事務,在提交此事務時執行一系列getMulti's 和putMulti's,我遇到了物體寫入限制錯誤。
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 多個物體的事務?
uj5u.com熱心網友回復:
你什么都做不了。此限制由平臺強制執行,以確保可擴展性并防止性能下降。您不能在單個事務中寫入超過 500 個物體。
這有可能改變對限制谷歌的一面,但沒有什么可以做在你的身邊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393703.html
