如何使用事务中的多个线程更新数据库项?

时间:2013-08-25 02:12:25

标签: c# sql-server asynchronous transactions transactionscope

我希望你能帮助我

我正在编写一个ASP.NET应用程序,我必须遍历数据表中的70,000多个数据行,以便更新数据库记录(每个数据表行都有更新数据库记录的信息)。 我的想法是将表分成10,000行表并创建一些异步方法来更新数据库(每个表一个异步方法)。 我需要确保表中的每条记录都是更新,因此所有内容都包含在TransacionScope块中。

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

我的代码如下

 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();
}

为了运行查询我正在使用单例实例,这会影响某些事情吗? 是否有更好的方法来完成此任务而不是拆分表和多线程?

提前致谢

1 个答案:

答案 0 :(得分:1)

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

相关问题