我正在尝试使用Task.WhenAll对数据库进行多个并行更新。代码流就是这样的。
在main方法中,我创建了一个事务范围并创建了主要事务的克隆并传递给了子进程。主要交易被阻止,直到孩子完成
using (var scope = DalcHelper.GetTransactionScope())
{
DependentTransaction transaction = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
var task1= Dalc.UpdateDetails1(transaction );
DependentTransaction transaction1 = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
var task2 = Dalc.UpdateDetails2(transaction1);
await Task.WhenAll(task1, task2 ).ConfigureAwait(false);
scope.Complete();
}
DalcMethod是这样的。这里从外部事务创建的克隆作为参数。完成从属交易,通知主要交易依赖完成
try
{
using (SqlCommand databaseCommand = DalcHelper.GetCommand(SPName))
using (var scope = new TransactionScope(dependentCloneTransaction, TransactionScopeAsyncFlowOption.Enabled))
{
-- Update database
scope.Complete();
}
}
finally
{
//Call complete on the dependent transaction
dependentCloneTransaction.Complete();
}
Dalc方法是返回Task
的异步方法我收到以下异常
事务已中止。尝试提升事务时失败。已经有一个与此命令关联的打开DataReader必须先关闭。等待操作超时
。谁能告诉我这里我做错了什么?