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