【发布时间】:2011-09-06 15:44:24
【问题描述】:
我必须更新一些我以 XML 形式发送数据的 DataTable。如果出现问题,我的存储过程具有中止操作的事务。但是我必须更新的记录数量很大,XML 达到 35 mb+。它只是在开发中,实时数据将会更大。
为了处理这个问题,我想通过分块发送数据来更新,也就是说,我将一次发送数百条记录的 XML。我尝试使用Task 库像这样并行更新数据库。
var ret=0;
using(var ts = new TransactionScope(TransactionScopeOption.Required,
new TimeSpan(2,0,0))
{
try
{
for(some condition)
{
get chunk of records
generate xml
create new task and call routing to push data to db
var t = create new task and call routing to push data to db
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
ts.Complete();
foreach(var t in tasks)
ret += t.Result;
}
catch(Exception ex)
{
//log exception and show user message
}
}
return ret;
但是我得到了事务已经被中止的异常。
我必须做些什么才能在单个事务中完成更新,因为如果任何块无法正确更新,我必须回滚任何更改。
编辑:- 我按照 Reed Copsey 的建议使用 new TransactionScope(TransactionScopeOption.Required,new TimeSpan(2,0,0)),但即使在 2-3 秒内完成对数据库的一次调用后,仍然出现错误 System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout。
只有一个电话
【问题讨论】:
-
WaitForAll不是Task上的方法 - 你能把你的真实代码放在适当的位置吗? -
@Reed Copsey 真正的代码在办公室 :D 方法是
Task.WaitAll。
标签: c# sql-server-2008 stored-procedures task transactionscope