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 回答