2013-08-25 57 views
0

我希望你能幫助我如何使用事務中的多個線程更新數據庫項目?

我正在寫一個ASP.NET應用程序,我有循環超過70000個多數據行的DataTable中,以便更新數據庫記錄(每個DataTable行有信息更新數據庫記錄)。 我的想法是將表分成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

交易超時設置爲2小時 我應該在連接字符串上添加 連接超時= 60 嗎? 我應該在命令中添加它嗎? –

+0

Connection Timeout屬性指示連接應輪詢活動數據庫連接的時間。命令超時是不同的,因爲它決定了等待sql命令完成的時間。 –

相關問題