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

Bar*_*ast 2 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();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它使用TransactionScope模式将100,000个整数写入(事务性,本地)队列.我的理解是这种类型的操作不会升级为DTC交易.

但是,如果我在运行时打开组件服务,我可以在本地DTC>事务列表中看到该事务.这意味着交易已经升级,对吧?

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

任何帮助,将不胜感激.

stu*_*rtd 6

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

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