2009-10-17 4 views
9

Из моего понимания NServiceBus выполняет метод Handle IMessageHandler в транзакции, если исключение распространяется из этого метода, тогда NServiceBus обеспечит отправку сообщения в очередь сообщений (вверх X количество раз до очереди ошибок) и т. Д., Поэтому мы имеем атомную операцию, так сказать.NServiceBus и NHibernate - обработчик и транзакции сообщений

Теперь, когда, если я внутри моего метода Handle NServiceBus Сообщение Я что-то вроде этого

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() 
} 

Что такое влияние этого на объем сделки? Действительно ли trans1 считается вложенной транзакцией с точки зрения ее отношений с транзакцией Nservicebus, хотя мы ничего не сделали, чтобы выйти за них замуж? (если нет, как бы связать транзакцию с NServiceBus?

Посмотрите на второй блок (trans2), если я раскомментирую инструкцию throw, выполнит ли транзакция NServiceBus, а затем и rollback trans1? В основных сценариях, скажем, я дамп выше, в консольное приложение, тогда trans1 является независимым, фиксирует, очищается и не откатывается. Я пытаюсь выяснить, что происходит сейчас, когда мы сидим в чьей-то транзакции, такой как NServiceBus?

Выше приведен пример кода, im не будет работать непосредственно с сеансом, больше как с помощью шаблона uow.

ответ

7

Если вы отметили свою конечную точку как транзакцию (.MsmqTransport(). IsTransactional (true) или просто AsA_Server), то транзакции будут включены в один открытый NServiceBus. Это означает, что коммиты, которые у вас есть в вашем обработчике, на самом деле не произойдут, и все это будет либо совершать, либо откатываться вместе - если вы специально не укажете, что ваши транзакции не будут привлекаться к внешней транзакции.

Независимо от того, работаете ли вы непосредственно с сеансом или через UoW, похоже, что вы хотите сделать больше одного для данного сообщения - почему? Сообщение уже является естественным UoW.

Смежные вопросы