使用Task.WhenAll跨多个线程的TransactionScope

时间:2016-09-24 01:09:55

标签: c# multithreading async-await task-parallel-library transactionscope

我正在尝试使用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必须先关闭。等待操作超时

。谁能告诉我这里我做错了什么?

0 个答案:

没有答案