Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新创建具有多线程和高并发性的阻塞环境_C#_Sql_Sql Server_Visual Studio_Tsql - Fatal编程技术网

C# 重新创建具有多线程和高并发性的阻塞环境

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

我们遇到一个问题,数百个线程正在尝试更新表ID,有时会遇到以下错误:

无法在对象
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不符合数据库基本原则。将数据收集到集合中并使用集合。

    我认为跟踪不是复制高并发性环境的好方法,因为跟踪本身的成本会扭曲结果,而且它并不是专门为此而设计的。播放不一定忠实于传入事件的时间

    我认为您最好创建特定的负载测试,以便有希望地解决遇到的问题,租用一些虚拟机并击败负载测试数据库


    话虽如此,跟踪是发现实际工作负载的好方法。有时,您无法看到针对数据库的所有活动。当特定问题出现时,可能会有一些“哦,是的”作业在运行。恐怕有上百种可能性,没有更多的线索就无法轻易诊断。

    太好了!您能为这种类型的测试推荐一些特定的框架吗?也许还有一些手动方式来测试>?