2009-10-17 3 views
9

NServiceBus는 트랜잭션 내에서 IMessageHandler의 Handle 메서드를 실행합니다. 예외가이 메서드에서 전파되면 NServiceBus는 메시지가 메시지 큐에 다시 저장되도록합니다 (위로 X 시간 전에 오류 대기열 등) 등등. 그래서 우리는 말하기 위해 원자 적 조작을했습니다.NServiceBus 및 NHibernate - 메시지 처리기 및 트랜잭션

이제 때 트랜잭션 범위에 대한이의 효과를 이것은 무엇

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

그런 짓을 내 NServiceBus 메시지 핸들 방법 내부 I 있다면? trans1은 이제 Nothing을 사용하여 NserviceBus 트랜잭션과의 관계에서 중첩 트랜잭션으로 계산됩니까? (NServiceBus의 트랜잭션에 연결하는 방법이 없다면

두 번째 블록 (trans2)을 보면 throw 문을 주석 처리하지 않으면 NServiceBus 트랜잭션이 trans1을 롤백 할 것인가? 기본 시나리오에서는 I dump 위의 콘솔 응용 프로그램에 다음 trans1 독립, 커밋, 플러시 및 롤백되지 않습니다. 우리가 NServiceBus 같은 다른 사람의 트랜잭션에 앉아 지금 무슨 일이 일어 났는지 명확히하려고 해요?

위의 코드는 단지 예제 코드이며, 인스턴트 메시징을 통해 세션과 직접 작업하지 않아도됩니다.

답변

7

엔드 포인트를 트랜잭션 (.MsmqTransport(), IsTransactional (true) 또는 AsA_Server)으로 표시하면 트랜잭션은 열려있는 하나의 NServiceBus에 참여합니다. 이것이 의미하는 바는 처리기 내부에있는 커밋은 실제로 발생하지 않으며 주변 트랜잭션에 참여하지 않도록 트랜잭션을 구체적으로 지정하지 않는 한 모든 것이 커밋되거나 롤백됩니다.

세션 또는 UoW를 직접 사용하든 상관없이 주어진 메시지에 대해 둘 이상을 수행하려는 것 같습니다. 그 이유는 무엇입니까? 메시지는 이미 자연스러운 UoW입니다.

관련 문제