C# 重新创建具有多线程和高并发性的阻塞环境
我们遇到一个问题,数百个线程正在尝试更新表ID,有时会遇到以下错误: 无法在对象C# 重新创建具有多线程和高并发性的阻塞环境,c#,sql,sql-server,visual-studio,tsql,C#,Sql,Sql Server,Visual Studio,Tsql,我们遇到一个问题,数百个线程正在尝试更新表ID,有时会遇到以下错误: 无法在对象dbo中插入重复键。表。复制品 键值为(100186) 并行执行数百次的方法执行多个存储过程: using (var createTempTableCommand = new SqlCommand()) { createTempTableCommand.CommandText = createTempTableScript; createTempTableCommand.Connection = om
dbo中插入重复键。表。复制品
键值为(100186)
并行执行数百次的方法执行多个存储过程:
using (var createTempTableCommand = new SqlCommand())
{
createTempTableCommand.CommandText = createTempTableScript;
createTempTableCommand.Connection = omniaConnection;
createTempTableCommand.ExecuteNonQuery();
}
foreach (var command in listOfSqlCommands)
{
using (var da = new SqlDataAdapter(command))
{
da.Fill(dtResults);
}
}
为了重新创建这样的环境/场景,是否建议简单地记录跟踪,然后简单地重放它
如何重建高并发性环境?
当您将解决方案重写为顺序而不是并行时,可以避免所有死锁/脏只读
您可以接受一些错误并创建适当的错误处理。使用重复密钥的阻塞或错误运行可以再次启动
您可以尝试重写解决方案,而无需同时使用更多线程来处理相同的行。您必须更改事务隔离级别(),将锁定更改为rowlocking(可能是ROWLOCK和UPDLOCK提示的组合)。此解决方案将最小化错误,但无法处理所有错误
所以我推荐2。在某些解决方案中,运行命令而不进行事务处理是更好的方法——您可以在不阻塞其他线程的情况下处理它,并在下一步中强制执行关系
对于“相似的职位”——同样的方式。在你的应用程序中,错误处理会更好。防止使用类似帖子中的游标解决方案,因为in不符合数据库基本原则。将数据收集到集合中并使用集合。我认为跟踪不是复制高并发性环境的好方法,因为跟踪本身的成本会扭曲结果,而且它并不是专门为此而设计的。播放不一定忠实于传入事件的时间
我认为您最好创建特定的负载测试,以便有希望地解决遇到的问题,租用一些虚拟机并击败负载测试数据库
话虽如此,跟踪是发现实际工作负载的好方法。有时,您无法看到针对数据库的所有活动。当特定问题出现时,可能会有一些“哦,是的”作业在运行。恐怕有上百种可能性,没有更多的线索就无法轻易诊断。太好了!您能为这种类型的测试推荐一些特定的框架吗?也许还有一些手动方式来测试>?