2012-09-14 15 views
5

Tengo un proceso simple que lee desde una cola, procesa los mensajes y los resultados a otro. Estoy tratando de ajustar esta transferencia dentro de un TransactionScope, de forma tal que tanto la lectura de la cola de entrada como la escritura en la cola de salida ocurran dentro de la misma transacción.TransactionScope que se eleva a MSDTC al enviar entre colas?

Sin embargo, parece que MSDTC se está utilizando para realizar esta transacción y, como resultado, es significativamente más lento que el uso de MessageQueueTransaction estándar. ¿Debería estar pasando esto? Tenía la impresión de que TransactionScope solo se elevaría a una transacción externa si el ámbito involucrado, por ejemplo, una lectura de la cola de mensajes y una escritura de la base de datos, pero no si solo estaban involucradas múltiples colas de mensajes.

Gracias.

EDITAR: Todo esto está en mi computadora portátil en este momento, así que estoy seguro de que no hay otras máquinas involucradas.

También deseo agregar que estoy confirmando que se está produciendo una transacción escalada marcando el complemento "Servicios de componentes" de Windows (es decir, el DTC local/Lista de transacciones). Puedo ver las transacciones que entran y salen de esta pantalla, lo que supongo significa que la transacción se ha escalado. ¿Me equivoco al asumir esto?

EDIT 2: Tengo el mismo comportamiento cuando estoy escribiendo en una sola cola. es decir

using (var ts = new TransactionScope()) 
{ 
    using (var q = new MessageQueue("...")) 
    { 
     /* write data */ 
    } 

    ts.Complete(); 
} 

puedo ver el DTC siendo utilizado con lo anterior, a pesar de la fila de espera en la máquina local.

+0

¿Dónde están las colas en relación con la aplicación? La misma máquina? Máquina diferente? –

+0

¿Está utilizando un servidor agrupado? –

+0

No, esto es todo local en mi computadora portátil en este momento. He actualizado mi pregunta con alguna aclaración. – Barguast

Respuesta

3

Parece que TransactionScope solo maneja transacciones externas con respecto a colas de mensajes. Debe usar MessageQueueTransaction si desea que sea solo interno. Esto funciona de manera diferente con las transacciones de SQL donde la transacción solo se intensifica si es necesario, que es lo que me confundió.

0

Tener un vistazo este artículo de MSDN: Transaction Management Escalation

Esta lista comportamiento típico escalada, como (más destacado es mío):

Cuando se desea proporcionar la transacción a otro objeto en otra aplicación dominio (incluido en proceso y límite de máquina) en el misma computadora, la infraestructura de System.Transactions escala automáticamente la transacción que administrará el Coordinador de transacciones distribuidas (MSDTC) de Microsoft . También se produce la escalada si obtiene otro administrador de recursos duradero. Cuando se escala, , la transacción permanece administrada en su estado elevado hasta su finalización .

Como puede ver, la elevación puede ocurrir no solo cuando hace cosas en la red, pero incluso si está haciendo cosas en la misma máquina. (Por ejemplo, recientemente tuve problemas en un caso donde estaba accediendo a una base de datos MS SQL desde el servicio de Windows en el mismo servidor (en clúster))

También esto podría suceder si un servicio WCF está involucrado en algún punto del proceso.

+0

En este caso, se trata de una transferencia de una cola a otra, ambas están en la misma máquina. También son colas de tipo MessageQueue, por lo que WCF no entra. Leeré el artículo con más detalle y veré si me da algunas pistas. Gracias. – Barguast

+0

RE: Comentario de Jens sobre "misma máquina". Un servidor agrupado es, por definición, al menos dos máquinas (una o más físicas, una o más virtuales). –

+0

Por el momento estoy probando esto en mi computadora portátil, así que estoy seguro de que no se cruzan los límites de la máquina, ya sea virtual o no. – Barguast

Cuestiones relacionadas