2011-11-18 15 views
6

se faccio la seguente:TransactionScope non funziona con Parallel Extensions?

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 non funziona. Se metto un breakpoint su scope.complete nessuna transazione è attiva e gli aggiornamenti sono già completi.

Se cambio a:

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

Tutto funziona come previsto. Qualcuno sa perché la versione parallela non funziona correttamente?

risposta

4

Non ho idea di cosa sia la tecnologia, ma in genere le transazioni sono vincolate al thread e non si propagano ai thread figli. Detto questo, dovrai iniziare una nuova transazione in ogni thread. Ma questo significa che avrai il maggior numero di transazioni indipendenti come thread.

Questa limitazione è ragionevole poiché la transazione è collegata alla connessione del database SQL sottostante che è a thread singolo.

4

è possibile propagare la transazione per i thread di lavoro come segue:

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 

NOTA: ti prego di perdonare eventuali problemi di sintassi VB, 'tis non la mia lingua madre

Problemi correlati