TransactionScope not working with Parallel Extensions?
Asked Answered
L

2

6

If i do the following:

 Using scope = New TransactionScope()
        entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(Sub(entry)
                                                                            _repos.Update(entry)
                                                                        End Sub)
        scope.Complete()
    End Using

TransactionScope doesn't work. If i put a breakpoint on the scope.complete no transaction is active and the updates are already complete.

If i change it to:

Using scope = New TransactionScope()
            entries.Content.ReadAs(Of IList(Of WebMaint)).ToList().ForEach(Sub(entry)
                                                                               _repos.Update(entry)
                                                                           End Sub)
            scope.Complete()
End Using

Everything works as expected. Anyone know why the parallel version doesn't work correctly?

Loblolly answered 18/11, 2011 at 19:29 Comment(0)
P
4

I have no idea what technology is it, but typically transactions are thread bound and do not propagate to children threads. That being said you will have to start a new transaction in each thread. But this means you will have as many independent transactions as threads.

This limitation is reasonable since the transaction is attached to the underlying SQL database connection which is single threaded.

Palmy answered 18/11, 2011 at 19:33 Comment(0)
E
4

You can propagate the transaction to the worker threads as follows:

Using scope = New TransactionScope()
    Dim rootTransaction As Transaction  = Transaction.Current

    entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(
        Sub(entry)    
            Dim dependentTransaction As DependentTransaction = rootTransaction.DependentClone(DependentCloneOption.RollbackIfNotComplete)

            _repos.Update(entry)

            dependentTransaction.Complete()
        End Sub)        

    scope.Complete()
End Using

NOTE: please forgive any VB syntax issues, 'tis not my native tongue

Eidson answered 24/11, 2011 at 0:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.