为什么这个简单的MSMQ交易升级为DTC?

时间:2012-09-17 15:20:01

标签: msmq message-queue transactionscope

我已经减少了一个问题,我需要使用以下示例代码:

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中看到该事务&gt;交易清单。这意味着交易已经升级,对吗?

为什么会这样?我在另一个程序中因性能不佳而被提示,并且看起来使用DTC进行这样一个简单的事务可能是一个因素。无论如何,我只是想了解原因。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:6)

来自http://geekswithblogs.net/dotnetrodent/archive/2008/04/16/121279.aspx

  

如果您只需要进行与消息队列相关的事务性工作,   没有任何其他资源需要在交易中   上下文(如数据库),不要使用TransactionScope,而是使用   MessageQueueTransaction class。用这个   用于控制仅与消息队列相关的事务的类   与使用完整分布式相比,性能损失较小   交易由DTC控制。