c#中用foreach重复更新数据实体时出现争用错误

Contention error when repeatedly updating a data entity with a foreach in c #

当实体根据服务器的请求每秒更新多次时,如何优化实体的更新?。更新使用的方法开发如下:

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: An error occurred, Grpc.Core.RpcException: Status(StatusCode=Aborted, Detail="too much contention on these datastore entities. please try again. entity groups: [(app=p~********, *********, "76fcb9c1-009e-****-b54f-68a45e9c****")]")

由于 DataStore 提供的分布式容错,更新实体的频率是有限制的。建议最多每秒更新一次,尽管在实践中您可能会超过此数次。

您可以阅读有关数据存储争用的 documentation。根据该文档,如果您希望每秒更新单个实体或多次写入实体组,最好尽早重新设计,以避免应用程序部署后可能发生的争用。

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