2009-03-23 17 views
36

Me preguntaba cómo usaría la clase TransactionScope de la manera correcta cuando se trata de multithreading?TransactionScope y multi-threading

Creamos un nuevo alcance en nuestro hilo principal y luego generamos un par de subprocesos de trabajo y queremos que estos participen en el alcance principal, de modo que, por ejemplo, se recurre a la reversión en cada trabajador si el alcance nunca es terminado.

Leí algo sobre TransactionScope usando ThreadStaticAttribute internamente, lo que hizo que lo anterior fuera imposible/muy difícil. ¿Alguien podría verificarlo de alguna manera? Si agotamos el código de forma sincrónica, las reversiones funcionan, es decir, las transacciones internas pueden participar en la transacción principal, pero no si cambiamos a una ejecución enhebrada.

Gracias

+1

Buena pregunta; este es un escenario que simplemente descarté como "no hago eso", pero después de la investigación, hay soporte a través de DependentTransaction. Aprendí algo, gracias. –

Respuesta

28

Ver MSDN:

También debe utilizar el TransactionScope y clase DependentTransaction para aplicaciones que requieren el uso de la misma transacción a través de múltiples llamadas a funciones o múltiples hilo llamadas .

Así que tal vez mirar en DependentTransaction - en particular, hay un ejemplo subproceso de trabajo, here.

+0

También encontré estas dos publicaciones de blog útiles: http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx y http://www.pluralsight.com/community/ blogs/jimjohn/archive/2005/05/01/7923.aspx –

+2

es una pena, ese blog no se encuentra ahora – Kiquenet

+0

@Kiquenet En casos como [estos] (http://web.archive.org/web/2/http : //pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx) [dos] (http://web.archive.org/web/2/http://pluralsight.com /community/blogs/jimjohn/archive/2005/05/01/7923.aspx), hay (casi) siempre la [máquina de retorno] (https://en.wikipedia.org/wiki/Wikipedia:Using_the_Wayback_Machine#Latest_archive_copy) –

17

Esto es correcto: la clase TransactionScope usa la propiedad Transaction.Current que almacena su valor en el campo, que está marcado con el atributo ThreadStatic.

El atributo ThreadStatic asegura que el valor de campo obtiene la afinidad de subprocesos, es decir, tiene un valor único en cada subproceso. Es el enfoque recomendado para compartir la fecha dentro de un hilo. También se conoce como Thread Local Storage (TLS).

La clase TransactionScope solo define un contexto de transacción en el hilo actual. Sin embargo, no significa que su código debe realizar todo el trabajo en ese hilo. Podría imaginarme un complejo algoritmo de cálculo que utiliza múltiples hilos.