2012-09-17 35 views
2

我減少了我在下面的示例代碼中的問題:爲什麼這個簡單的MSMQ交易升級到DTC?

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(); 
} 

正如你所看到的,所有它不把它寫10萬個整數使用TransactionScope圖案(事務,本地)隊列。我的理解是,這種類型的操作不會升級到DTC交易。

但是,如果在運行時打開組件服務,則可以在本地DTC>事務列表中看到該事務。這意味着交易已經升級了,對嗎?

爲什麼會發生這種情況?在另一個程序中,由於性能不佳,我得到了提示,並且似乎將DTC用於這種簡單的事務可能是一個因素。無論如何,我只是想了解原因。

任何幫助,將不勝感激。

回答

6

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

如果你只需要做好相關消息隊列, 而不需要在事務 上下文(如數據庫)的任何其他資源事務性工作,不使用的TransactionScope ,而是 的MessageQueueTransaction class。使用此類來控制僅與消息隊列相關的事務處理 ,與使用由DTC控制的完整分佈式事務處理相比,其性能損失較小。

+0

這不是我想聽到的,但它似乎是答案。我的感覺是TransactionScope可以處理,就像它處理SQL事務一樣,但它不會顯示。好吧。感謝您的回覆。 – Barguast