3

私が抱えている問題を次のコード例に減らしました。

var inQueue = ".\private$\testqueue";
using (var ts = new TransactionScope())
{
    using (var q = new MessageQueue(inQueue, QueueAccessMode.Send))
    {
        for (var i = 0; i < 100000; ++i)
        {
            var msg = new Message(i);
            q.Send(msg, MessageQueueTransactionType.Automatic);
        }
    }
    ts.Complete();
}

ご覧のとおり、TransactionScope パターンを使用して、(トランザクションのローカル) キューに 100,000 個の整数を書き込むだけです。私の理解では、このタイプの操作は DTC トランザクションにエスカレートしないということです。

ただし、実行中にコンポーネント サービスを開くと、[ローカル DTC] > [トランザクション リスト] にトランザクションが表示されます。これは、トランザクションがエスカレートされたことを意味しますよね?

なぜこれが起こるのでしょうか?私は別のプログラムのパフォーマンスの悪さからこれに駆り立てられましたが、そのような単純なトランザクションに DTC を使用したことが要因のようです。とにかく、原因を理解したいだけです。

どんな助けでも大歓迎です。

4

1 に答える 1

7

http://geekswithblogs.net/dotnetrodent/archive/2008/04/16/121279.aspxから

メッセージ キューに関連するトランザクション作業のみを行う必要があり、トランザクション コンテキストに必要な他のリソース (データベースなど) がない場合は、TransactionScope を使用せずにMessageQueueTransaction クラスを使用します。このクラスを使用してメッセージ キューのみに関連するトランザクションを制御すると、DTC によって制御される完全な分散トランザクションを使用するよりも、パフォーマンスの低下が少なくなります。

于 2012-09-18T12:37:56.410 に答える