私の理解では、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パターンのように、セッションを直接操作することはありません。