2009-10-17 19 views
9

Desde mi entender NServiceBus ejecuta el método de la manija de un IMessageHandler dentro de una transacción, si una excepción se propaga fuera de este método, entonces NServiceBus asegurarán el mensaje se vuelve a poner en la cola de mensajes (hasta X cantidad de veces antes de cola de error) etc., así que tenemos una operación atómica, por así decirlo.NServiceBus y NHibernate - controlador de mensajes y transacciones

Ahora, cuando si yo dentro de mi método de la manija NServiceBus mensaje que hago algo como esto

using(var trans = session.BeginTransaction()) 
{ 

    person.Age = 10; 
    session.Update<Person>(person); 
    trans.Commit() 
} 

using(var trans2 = session.BeginTransaction()) 
{ 

    person.Age = 20; 
    session.Update<Person>(person); 
    // throw new ApplicationException("Oh no"); 
    trans2.Commit() 
} 

¿Cuál es el efecto de esto en el ámbito de transacción? ¿Trans1 ahora se cuenta como una transacción anidada en términos de su relación con la transacción Nservicebus aunque no hayamos hecho nada para vincularlos? (Si no, ¿cómo se vincularía a la transacción de NServiceBus?

Mirando el segundo bloque (trans2), si eliminé el comentario de la instrucción throw, ¿la transacción NServiceBus también retrotraerá trans1? En los escenarios básicos, digamos que elimino lo anterior en una aplicación de consola, luego trans1 es independiente, confirmado, enrojecido y no se revertirá. Estoy tratando de aclarar lo que sucede ahora que nos sentamos en la transacción de otra persona como NServiceBus?

Lo anterior es solo un código de ejemplo, Im no estaría trabajando directamente con la sesión, más bien a través de un patrón uow.

Respuesta

7

Si marca su punto final como transacción (.MsmqTransport(). IsTransactional (verdadero) o simplemente AsA_Server), entonces el las transacciones se incluirán en el que NServiceBus abrió. Lo que esto significa es que las confirmaciones que tiene dentro de su controlador en realidad no sucederán y todo se comprometerá o retrotraerá juntos, a menos que específicamente indique a sus transacciones que no se alisten en la transacción ambiental.

Tanto si trabaja directamente con la sesión como a través de UoW, parece que desea hacer más de uno para un mensaje dado, ¿por qué? El mensaje ya es la UOW natural.

Cuestiones relacionadas