9

私の理解では、NServiceBusはトランザクション内でIMessageHandlerのHandleメソッドを実行します。例外がこのメソッドから伝播した場合、NServiceBusはメッセージがメッセージキューに戻されるようにします(エラーキューの前にX回まで)など。つまり、いわば不可分操作があります。

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のトランザクションにどのようにリンクしますか?

2番目のブロック(trans2)を見て、throwステートメントのコメントを外すと、NServiceBusトランザクションはtrans1もロールバックしますか?基本的なシナリオでは、上記をコンソールアプリにダンプすると、trans1は独立し、コミットされ、フラッシュされ、ロールバックされません。NServiceBusのような他の誰かのトランザクションに座っているときに何が起こるかを明確にしようとしていますか?

上記は単なるサンプルコードであり、uowパターンのように、セッションを直接操作することはありません。

4

1 に答える 1

7

エンドポイントをトランザクション(.MsmqTransport()。IsTransactional(true)または単にAsA_Server)としてマークすると、トランザクションは開かれた1つのNServiceBusに参加します。これが意味するのは、ハンドラー内にあるコミットは実際には発生せず、トランザクションにアンビエントトランザクションに参加しないように特に指示しない限り、すべてがコミットまたはロールバックされるということです。

セッションを直接操作するか、UoWを介して作業するかに関係なく、特定のメッセージに対して複数のことを実行したいようです-なぜですか?メッセージはすでに自然なUoWです。

于 2009-10-17T14:18:02.770 に答える