2

これが私のシナリオです:トランザクションを完了する前に、異なるWCFサービスに対して3つまたは4つの呼び出しを行う必要があります-もしあれば、私のオプションは何ですか?

ServiceA.SaveWork(work1);
ServiceB.SaveWork(work2);
ServiceC.SaveWork(work3);
ServiceD.SendNotification(notification);

1つの呼び出しが失敗すると、すべてが失敗します...これらのサービスは同じドメインにない場合があることに注意してください。

乾杯!

4

2 に答える 2

1

これを実現するには、それらをSystem.Transctions.TransactionScopeにラップできるはずです。

using(TransactionScope scope = new TransactionScope())
{
   ServiceA.SaveWork(work1);
   ServiceB.SaveWork(work2);
   ServiceC.SaveWork(work3);
   ServiceD.SendNotification(notification);

   scope.Complete();
}

もちろん、WCF サービスがトランザクションの一部になることを明示的に妨げないようにする必要があります。(TransactionFlow 属性を確認してください - TransactionFlow.NotAllowed 設定は避けてください!)

于 2010-03-10T17:23:45.093 に答える
1

これらのサービスがすべて別のマシンなどにある場合、2 フェーズ コミットを使用すると、現実世界で多くの問題が発生します。

したがって、トランザクションは良い解決策ではないと思います....

エラーから回復するために必要に応じて作業を元に戻すことができるように、すべてのサービスを作成する必要があると思います。作業項目を元に戻すことは、現実の世界では非常に複雑になる可能性があります。

たとえば、車とホテルを予約する必要があり、ホテルが全焼した場合、お金を失うことなく車の予約を取り消すことは期待できません。

ただし、すべてのサービスが同じデータベース上にある場合は、トランザクションがうまく機能する可能性があります。

于 2010-03-10T17:24:16.547 に答える