如何使用任务保存事务范围
How to save the transaction scope with Task
我想要在 TransactionScope 中执行 运行 个任务,
我通过 80 个保存任务处理 400,000 条记录(每次保存 5000 条记录)
这是我的代码:
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();
}
}
但是我遇到了异常:
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()
您有 3 个选择:
1) 增加超时时间。您可能必须将它增加得相当高,并且非常长的 运行ning 事务会干扰数据的其他用途。
2) 提高性能(例如添加索引或 CPU)以满足超时。如果您要移动那么多数据,这可能不可行。
3) 删除使用事务的要求。很多时候,您可以通过插入临时 table 来避免长 运行ning 事务,例如,作为单个 SQL 插入的暂存区(这将 运行比你的数千个任务更快)。
在大多数情况下,第三个选项将是我的首选。
我想要在 TransactionScope 中执行 运行 个任务, 我通过 80 个保存任务处理 400,000 条记录(每次保存 5000 条记录) 这是我的代码:
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();
}
}
但是我遇到了异常:
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()
您有 3 个选择:
1) 增加超时时间。您可能必须将它增加得相当高,并且非常长的 运行ning 事务会干扰数据的其他用途。
2) 提高性能(例如添加索引或 CPU)以满足超时。如果您要移动那么多数据,这可能不可行。
3) 删除使用事务的要求。很多时候,您可以通过插入临时 table 来避免长 运行ning 事务,例如,作为单个 SQL 插入的暂存区(这将 运行比你的数千个任务更快)。
在大多数情况下,第三个选项将是我的首选。