2011-11-18 17 views
6

Si hago lo siguiente:¿TransactionScope no funciona con las extensiones paralelas?

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 no funciona. Si pongo un punto de interrupción en scope.complete, ninguna transacción está activa y las actualizaciones ya están completas.

si la 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 

Todo funciona como se esperaba. ¿Alguien sabe por qué la versión paralela no funciona correctamente?

Respuesta

4

No tengo idea de qué tecnología es, pero por lo general las transacciones están ligadas a hilos y no se propagan a hilos secundarios. Dicho esto, tendrá que comenzar una nueva transacción en cada hilo. Pero esto significa que tendrá tantas transacciones independientes como hilos.

Esta limitación es razonable ya que la transacción se adjunta a la conexión de base de datos SQL subyacente que tiene un solo subproceso.

4

Puede propagar la transacción a los subprocesos de trabajo de la siguiente manera:

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: Por favor, perdona cualquier problema de sintaxis VB, 'tis no es mi lengua materna

Cuestiones relacionadas