在C#中使用foreach重复更新数据实体时发生争用错误

时间:2018-07-31 22:35:47

标签: c# google-cloud-datastore datastore contention

当通过服务器的请求每秒对实体进行多次更新时,如何优化实体的更新?用于更新的方法开发如下:

public async Task<bool> Update(T entity, string key)
    {
        try
        {
            MakeConnection();
            var trans = _db.BeginTransaction();
            var type = typeof(T);
            var keyFactory = _db.CreateKeyFactory(type.Name);
            var task = trans.Lookup(keyFactory.CreateKey(key));
            if (task != null)
            {
                _cache.KeyCache[type.Name] = _db.CreateKeyFactory(type.Name);
                var entities = _mapper.Map<Entity>(entity);
                task = entities;
                trans.Update(task);
            }
            await trans.CommitAsync();
        }
        catch (Exception e)
        {
            throw new InvalidOperationException($"An error occurred, {e}");
        }
        return true;
    }

这是错误:

  

InvalidOperationException:发生错误,Grpc.Core.RpcException:   Status(StatusCode = Aborted,Detail =“关于这些的争用太多   数据存储实体。请再试一遍。实体组:   [(app = p〜********,*********,   “ 76fcb9c1-009e-****-b54f-68a45e9c ****”)]“)

1 个答案:

答案 0 :(得分:0)

由于DataStore提供的分布式容错能力,因此更新实体的频率受到限制。建议您每秒最多更新一次,尽管实际上,您可能会多次更新。

您可以阅读关于数据存储争用的documentation。根据该文档,如果您希望每秒更新一个实体或写一个实体组的次数超过每秒几次,那么最好尽早进行设计工作,以避免在部署应用程序后可能出现争用。 / p>

一种可能的选择是使用Sharding counters