Передача TransactionScope задачам, созданным Parallel.Invoke - PullRequest
4 голосов
/ 02 сентября 2011

Я хочу, чтобы TxJobs, работающие параллельно, создали область из этой родительской транзакции.Как мне сделать эту работу?

using (var tx = TransactionScope()) {
    Parallel.Invoke(TxJob1, TxJob2) ;
    tx.Complete();
}

Я передал DependentClone:

using (var tx = new TransactionScope()) {
    var dtx1 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    var dtx2 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    Parallel.Invoke(() => TxJob1(dtx1), () => TxJob2(dtx2)) ;
    tx.Complete();
}

В методах TxJob1 и TxJob2 это работает, если я просто вызываю Complete на DependentClones.Однако, если я создаю область из клона, я получаю TransactionAbortedException:

void TxJob1(Transaction dt) {
    using (var tx = new TransactionScope(dt)) {
        Console.WriteLine(dtx.TransactionInformation.LocalIdentifier);
        tx.Complete();
    }
}

Исключение возникает при вызове Complete в основном методе, а не в TxJobs.Почему это не удается?

[править] Если я явно вызову Complete для DependentTransaction в TxJobs, то это работает.Если я не вызываю Complete для нового TransactionScope в TxJobs (вызывая откат), родительская транзакция завершается неудачно.Похоже, мне нужно вызвать Complete для обоих объектов транзакции.

1 Ответ

2 голосов
/ 09 сентября 2011

Похоже, мне нужно вызвать Complete как для зависимого клона, так и для TransactionScope. MS делает то же самое в своем образце кода .

...