程序代码如下:
Parallel.For(0,dt.ows.Count,i=>
{
SqlHelper.ExecuteNonQuery(“delete Checked where SourceId=dt.Rows[i][“Id”);
}
这样的一个删除功能。
config配置连接字符串加了:Connect Timeout=60;
运行大致几分钟就会报连接等待超时的错误。问一下这个错误原因应该出在哪块。谢谢。
Parallel.For(0,dt.ows.Count,i=>
{
SqlHelper.ExecuteNonQuery(“delete Checked where SourceId=dt.Rows[i][“Id”);
}
这样的一个删除功能。
config配置连接字符串加了:Connect Timeout=60;
运行大致几分钟就会报连接等待超时的错误。问一下这个错误原因应该出在哪块。谢谢。
解决方案
20
假如你使用传统关系数据库,这不可能简单地并发多线程执行。
关系数据库要锁住 Checked 表的查询功能(好在你是直接指定了条件 SourceId=….,假如更复杂一点的条件将更容易死锁)。而且每一条语句单独作为一个数据库事务、启动了一个复杂的事务处理过程。
正确的做法,是将每(例如)200条“delete Checked where SourceId =…… ; ”语句合并到一个显式的 DbTransaction 中去执行,每一批处理才需要数据库端启动一个事务。然后使用单线程循环执行就可以了。
关系数据库要锁住 Checked 表的查询功能(好在你是直接指定了条件 SourceId=….,假如更复杂一点的条件将更容易死锁)。而且每一条语句单独作为一个数据库事务、启动了一个复杂的事务处理过程。
正确的做法,是将每(例如)200条“delete Checked where SourceId =…… ; ”语句合并到一个显式的 DbTransaction 中去执行,每一批处理才需要数据库端启动一个事务。然后使用单线程循环执行就可以了。