C# 如何使用任务保存事务范围
我想在TransactionScope中运行任务, 我通过80次保存任务处理了400000条记录(每次保存5000条记录) 这是我的代码:C# 如何使用任务保存事务范围,c#,task,transactionscope,C#,Task,Transactionscope,我想在TransactionScope中运行任务, 我通过80次保存任务处理了400000条记录(每次保存5000条记录) 这是我的代码: using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.MaxValue)) { try {
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.MaxValue))
{
try
{
var tasks = new List<Task>();
foreach (var empsGroup in empsGroups)
{
tasks.Add(Task.Run(() =>
{
//add save of 5000 records
}
}
Task allTasks = Task.WhenAll(tasks.ToArray());
try
{
allTasks.Wait();
}
catch (Exception e)
{
scope.Dispose();
}
scope.Complete();
}
catch (Exception e)
{
scope.Dispose();
}
}
您有3种选择:
1) 增加超时时间。您可能必须将其提高到相当高的水平,而且运行时间很长的事务可能会干扰数据的其他使用
2) 提高性能(例如添加索引或CPU)以满足超时要求。如果要移动那么多数据,这可能不可行
3) 删除使用事务的要求。很多时候,您可以通过插入一个临时表来避免长时间运行的事务,例如,作为单个SQL插入的暂存区域(该区域的运行速度比您的数千个任务快得多)
在大多数情况下,第三个选项是我的首选。使用块将处理范围。没有必要手动处理它。顺便说一句,您的异常处理非常糟糕。sir-rufo-谢谢,我会试试。(我为论坛删除了我的特定日志代码并抛出)为什么不尝试
TransactionScope(System.Transactions.Transaction transactionToUse,TimeSpan scopeTimeout,System.Transactions.TransactionScopeAsyncFlowOption asyncFlowOption)代码>构造函数的变体?请注意OP已经使用了TimeSpan.MaxValue
超时。尽管有此设置,但超时在11分钟后发生
message: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
--- End of inner exception stack trace ---
at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()