5

あるキューから読み取り、メッセージを処理し、別のキューに出力する単純なプロセスがあります。この転送をTransactionScope内でラップしようとしています。これにより、入力キューからの読み取りと出力キューへの書き込みの両方が同じトランザクション内で発生します。

ただし、このトランザクションの実行にはMSDTCが使用されているように見えるため、標準のMessageQueueTransactionを使用するよりも大幅に遅くなります。これが起こっているべきですか?TransactionScopeは、たとえばメッセージキューの読み取りやデータベースの書き込みなどのスコープが関係している場合にのみ外部トランザクションに昇格し、複数のメッセージキューが関係している場合は昇格しないという印象を受けました。

ありがとう。

編集:これは現在私のラップトップにすべてあるので、他のマシンは関与していないと確信しています。

また、Windowsの「コンポーネントサービス」スナップイン(つまり、ローカルDTC /トランザクションリスト)をチェックインして、エスカレーションされたトランザクションが発生していることを確認していることを付け加えたいと思います。この画面に出入りするトランザクションを確認できます。これは、トランザクションがエスカレートされたことを意味すると思います。私はこれを仮定するのは間違っていますか?

編集2:単一のキューに書き込んでいるときと同じ動作が発生します!すなわち

using (var ts = new TransactionScope())
{
    using (var q = new MessageQueue("..."))
    {
        /* write data */
    }

    ts.Complete();
}

キューがローカルマシン上にあるにもかかわらず、DTCが上記で使用されていることがわかります。

4

3 に答える 3

3

TransactionScopeは、メッセージキューに関して外部トランザクションのみを処理するようです。内部のみにする場合は、MessageQueueTransactionを使用する必要があります。これは、トランザクションが必要な場合にのみエスカレーションされるSQLトランザクションとは異なる動作をします。これは、私を混乱させたものです。

于 2012-09-18T13:38:16.033 に答える
0

このMSDNの記事をご覧ください:トランザクション管理のエスカレーション

このリストは、次のような典型的なエスカレーション動作を示しています(ハイライトは私のものです)。

同じコンピューター上の別のアプリケーションドメイン(プロセスとマシンの境界を越えたものを含む)の別のオブジェクトにトランザクションを提供する場合、System.Transactionsインフラストラクチャは、Microsoft分散トランザクションコーディネーター(MSDTC)によって管理されるトランザクションを自動的にエスカレーションします。別の永続的なリソースマネージャーを参加させた場合にも、エスカレーションが発生します。エスカレーションされると、トランザクションは完了するまで昇格状態で管理されたままになります。

ご覧のとおり、昇格は、ネットワークを介して作業を行っている場合だけでなく、同じマシンで作業を行っている場合でも発生する可能性があります。(たとえば、最近、同じ(クラスター化された)サーバー上のWindowsサービスからMS SQLデータベースにアクセスしている場合に問題が発生しました。)

また、これは、WCFサービスがプロセスのどこかに関与している場合に発生する可能性があります。

于 2012-09-15T16:15:42.990 に答える
0

TransactionScopeは、メッセージキューに関して外部トランザクションのみを処理するようです。

この声明は真実ではありません。TransactionScopeは、メッセージキュー内のローカルトランザクションを処理します。これは、MSDTCを使用して処理するだけです。

于 2019-06-04T12:56:36.947 に答える