I have multiple methods inside a Parallel.Invoke() that need to run inside of a transaction.  These methods all invoke instances of SqlBulkCopy   The use-case is "all-or-none", so if one method fails nothing gets committed.  I am getting a TransactionAbortedException ({"Transaction Timeout"}) when I call the Complete() method on the parent transaction.
This is the parent transaction:
using (var ts = new TransactionScope())
{
    var saveClone = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
    var saveErrorsClone = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
    var saveADClone = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
    var saveEnrollmentsClone = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
    Parallel.Invoke(_options, () =>
        {
            Save(data, saveClone);
        },
        () =>
        {
            SaveErrors(saveErrorsClone);
        },
        () =>
        {
            SaveEnrollments(data, saveEnrollmentsClone);
        });
ts.Complete();  
}//***** GET THE EXCEPTION HERE *****
Here's a dependent transaction that makes use of SqlBulkCopy (they're all the same structure).  I'm passing-in the parent and assigning it to the child's TransactionScope
private void Save(IDictionary<string, string> data, Transaction transaction)
{
    var dTs = (DependentTransaction)transaction;
    if (transaction.TransactionInformation.Status != TransactionStatus.Aborted)
    {
        using (var ts = new TransactionScope(dTs))
        {
            _walmartData.Save(data);
            Debug.WriteLine("Completed Processing XML - {0}", _stopWatch.Elapsed);
            ts.Complete();
        }
    }
    else
    {
        Debug.WriteLine("Save Not Executed - Transaction Aborted - {0}", _stopWatch.Elapsed);    
        dTs.Complete();
    }
    dTs.Complete();
}
EDIT (added my SqlBulkCopy method...notice null for the transaction param)
private void SqlBulkCopy(DataTable dt, SqlBulkCopyColumnMappingCollection mappings)
{
    try
    {
        using (var sbc = new SqlBulkCopy(_conn, SqlBulkCopyOptions.TableLock, null))
        {
            sbc.BatchSize = 100;
            sbc.BulkCopyTimeout = 0;
            sbc.DestinationTableName = dt.TableName;
            foreach (SqlBulkCopyColumnMapping mapping in mappings)
            {
                sbc.ColumnMappings.Add(mapping);
            }
            sbc.WriteToServer(dt);
        }
    }
    catch (Exception)
    {
        throw;
    }
}
Besides fixing the error, I'm open to alternatives. Thanks.
 
     
     
     
     
    