【问题标题】:Why is this simple MSMQ Transaction escalated to DTC?为什么这个简单的 MSMQ 事务升级为 DTC?
【发布时间】:2012-09-18 20:37:56
【问题描述】:

我已经减少了以下示例代码所遇到的问题:

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 用于这样一个简单的事务可能是一个因素。无论如何,我只是想了解原因。

任何帮助将不胜感激。

【问题讨论】:

    标签: msmq message-queue transactionscope


    【解决方案1】:

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

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

    【讨论】:

    • 这不是我想听到的,但似乎确实是答案。我的印象是 TransactionScope 可以处理任何一个,就像它处理 SQL 事务一样,但它似乎不会。那好吧。感谢您的回复。
    猜你喜欢
    • 2011-08-20
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多