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.