2012-09-14 54 views
5

我有一個簡單的過程,從一個隊列讀取,處理消息,並輸出到另一個。我正在嘗試在TransactionScope中封裝這種傳輸,這樣從輸入隊列中讀取和在輸出隊列中寫入都發生在同一個事務中。TransactionScope在隊列之間發送時升級到MSDTC?

然而,它會出現MSDTC被用來進行本次交易,並且作爲結果,它比使用標準MessageQueueTransaction顯著慢。這是否應該發生?我的印象是,如果涉及範圍(例如消息隊列讀取和數據庫寫入),而不是僅涉及多個消息隊列,則TransactionScope只會提升爲外部事務。

謝謝。

編輯:這是所有我的筆記本電腦的那一刻,讓我確信沒有其他的機器均有涉及。

我也想補充一點,我確認了升級交易是通過Windows的‘組件服務’管理單元檢查發生(即本地DTC /事務列表)。我可以看到交易進入和離開這個屏幕,我認爲這意味着交易已經升級。假設我錯了嗎?

編輯2:我發現了相同的行爲,當我剛寫單個隊列!即

using (var ts = new TransactionScope()) 
{ 
    using (var q = new MessageQueue("...")) 
    { 
     /* write data */ 
    } 

    ts.Complete(); 
} 

儘管隊列在本地機器上,但我可以看到DTC與上面一起使用。

+0

與應用有關的隊列在哪裏?同一臺機器?不同的機器? –

+0

您使用的是羣集服務器嗎? –

+0

不,這一切都在我的筆記本電腦上。我已經通過一些澄清更新了我的問題。 – Barguast

回答

3

看來的TransactionScope只能處理對於消息隊列外部事務。如果您希望它只是內部的,則必須使用MessageQueueTransaction。這與SQL事務的工作方式不同,如果需要的話,事務只會升級,這使我感到困惑。

0

看看這個MSDN文章:Transaction Management Escalation

該列表典型的升級行爲,像(亮點是我的):

當你想在另一個 應用提供交易到另一個對象(包括跨越進程和機器界線) 關於同一臺計算機,該System.Transactions的基礎設施 自動升級到由微軟 分佈式事務處理協調器(MSDTC)來管理事務。如果您登記另一個耐用資源管理器,則會發生升級 。當升級時,交易仍處於升高狀態,直至其完成 。

正如您所看到的,不僅在您通過網絡進行操作時,而且即使您在同一臺計算機上執行操作,也會發生提升。 (例如,我最近在遇到同一個(集羣)服務器上的Windows服務訪問MS SQL數據庫的情況下遇到了麻煩。)此外,如果WCF服務涉及進程中某處,則可能會發生這種情況。

+0

在這種情況下,它是從一個隊列到另一個隊列的傳輸,它們都在同一臺機器上。這些也是MessageQueue類型的隊列,所以WCF不會進入它。我會給文章更詳細的閱讀,看看它是否給了我一些線索。謝謝。 – Barguast

+0

RE:Jens對「同一臺機器」的評論。根據定義,集羣服務器至少有兩臺機器(一臺或多臺物理機,一臺或多臺虛擬機)。 –

+0

目前我在我的筆記本電腦上測試了這一點,所以我確定沒有虛擬或不虛擬的機器邊界。 – Barguast

相關問題