C# 如何在一个事务中使用多个线程更新数据库项?

C# 如何在一个事务中使用多个线程更新数据库项?,c#,sql-server,asynchronous,transactions,transactionscope,C#,Sql Server,Asynchronous,Transactions,Transactionscope,我希望你能帮助我 我正在编写一个ASP.NET应用程序,为了更新数据库记录,我必须在一个datatable中循环超过70000个datarows(每个datatable行都有更新数据库记录的信息)。 我的想法是将表拆分为10000行表,并创建一些异步方法来更新数据库(每个表一个异步方法)。 我需要确保表上的每一条记录都是更新的,所以所有内容都被包装到TransacionScope块中 问题是,当我运行Page.ExecuteRegisteredAsyncTasks()时,我收到一个超时异常,告诉

我希望你能帮助我

我正在编写一个ASP.NET应用程序,为了更新数据库记录,我必须在一个datatable中循环超过70000个datarows(每个datatable行都有更新数据库记录的信息)。 我的想法是将表拆分为10000行表,并创建一些异步方法来更新数据库(每个表一个异步方法)。 我需要确保表上的每一条记录都是更新的,所以所有内容都被包装到TransacionScope块中

问题是,当我运行Page.ExecuteRegisteredAsyncTasks()时,我收到一个超时异常,告诉我连接的最大允许时间已经完成

我的代码如下

 using (TransactionScope transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, new TimeSpan(0, 120, 0)))
 {
 //Validando momentos                                        
 clConsultoraCompensationPlan.asignaValoresFinales(dtConsultoraCompensationPlan,
 compensation_plan, usuario,pagina);
 transaccion.Complete();
 }

private static void asignaValoresFinales(DataTable dtConsultorasMaster, clCompensationPlan compensation_plan, int usuario,Page pagina)
 {
 List<DataTable> lista_tablas = new List<DataTable>();
 //Separadno la tabla en 30 tablas
 foreach(IEnumerable<DataRow> renglones in LinqExtensions.Split(dtConsultorasMaster.AsEnumerable(), 50))
 {
 lista_tablas.Add(renglones.CopyToDataTable());
 }

 foreach (DataTable dtConsultoraCompensationPlan in lista_tablas)
 {
 AsignaValoresFinalesAsincrono tarea = new AsignaValoresFinalesAsincrono();
 PageAsyncTask tarea_asincrona = new PageAsyncTask(tarea.OnBegin, tarea.OnEnd, tarea.OnTimeout, new ContenedorAsignaValoresFinalesAsincrono(dtConsultoraCompensationPlan,compensation_plan,usuario), true);
 pagina.RegisterAsyncTask(tarea_asincrona);                
 }
 pagina.ExecuteRegisteredAsyncTasks();
}
使用(TransactionScope transaccion=new TransactionScope(TransactionScopeOption.RequiresNew,new TimeSpan(0,120,0)))
{
//Validando momentos
CLConsultorA补偿计划。亚洲增值税最终(DTConsultorA补偿计划,
帕吉纳乌萨里奥补偿计划);
完全横渡;
}
专用静态无效AsignavaloresFinals(数据表dtConsultorasMaster,clCompensationPlan compensation\u plan,int Usario,第pagina页)
{
List lista_tablas=新列表();
//表30中的表
foreach(LinqExtensions.Split中的IEnumerable renglones(dtConsultorasMaster.AsEnumerable(),50))
{
lista_tablas.Add(renglone.CopyToDataTable());
}
foreach(列表中的数据表DTConsultorA补偿计划)
{
AsignaValoresFinalesAsincrono tarea=新的AsignaValoresFinalesAsincrono();
PageAsyncTask tarea_asincrona=新的PageAsyncTask(tarea.OnBegin、tarea.OnEnd、tarea.OnTimeout、新的contended或signavaloresfinalessincrono(DTConsultor补偿计划、补偿计划,通常为true));
pagina.RegisterAsyncTask(tarea_asincrona);
}
pagina.ExecuteRegisteredAsyncTasks();
}
为了运行查询,我使用了一个单例实例,这会影响什么吗? 有没有比拆分表和多线程更好的方法来完成此任务


提前感谢

这是更新中的超时问题。如果事务作用域使用一个连接,则您可能需要在命令或连接字符串中更新命令超时。

事务超时设置为2小时,是否应在连接字符串中添加连接超时=60?我是否也应该将其添加到命令中?Connection Timeout属性指示连接轮询活动db连接的时间。命令超时是不同的,因为它指示等待sql命令完成的时间。