2014-09-22 59 views
0

我有一個特定端點多個消息處理程序做了對SQL Azure數據庫工作(目前仍在使用本地SQL 2012實例)。我有一個發佈2個事件的命令處理程序,稱它們爲X和Y.在同一個端點中,我有X的訂戶和Y的訂戶。這兩個訂戶都在內部使用相同的數據訪問組件,稱爲Z.依賴項注入是基於每個呼叫配置的,不是共享的。交易在NServicebus使用Azure的服務總線傳輸

組件Z在窗簾下使用實體框架6。我遇到的問題是,只是打開數據庫是拋出一個SqlException並抱怨MSDTC升級。

我暫時包裹處理的TransactionScope.Suppress並已經停止了錯誤,但我相信我失去了一些東西更根本。

是它配置端點是非事務性的一個簡單的事情?我原以爲這隻會看到我配置使用Azure服務總線作爲傳輸機制。如果我這樣做,如果在消息處理程序中引發異常,NServiceBus仍會重試? (直到單反限制 - 不是問題的一部分,我也理解冪等問題)。

+0

您是使用SQL Server作爲NServiceBus的傳輸方式,還是僅僅將數據存儲爲數據存儲? 對於Azure服務總線傳輸 - NSB將像往常一樣重試FLR(如果已配置SLR)的異常。 – 2014-09-23 20:49:47

+0

它看起來像一個配置問題,但我努力瞭解您的設置(您使用的是什麼NServiceBus傳輸?) – 2014-09-24 12:12:21

+0

SQL Server僅用於數據存儲。我正在使用Azure服務總線作爲傳輸。我也讀過,如果我使它非事務性,我不會得到FLR或單反重試?那是對的嗎。 – 2014-10-03 13:54:27

回答

0

@Phil,

首先,你不應該使用MSDTC與SQL Azure的 - 它不支持。建議使用該功能,但只有under review。 DTC在Azure上不受支持。或者,您可以查看following suggestion以使用SqlTransaction方法。

其次,你使用的交通工具無關,與你的數據訪問。由於您使用的是Azure Service Bus,因此它不會成爲處理程序代碼的一部分。使處理程序成爲事務處理是強制原子更改或回滾。無論您的處理程序如何,都會重試。挑戰在於,當處理程序/端點不是事務處理時,並且在處理程序中,第一次寫入DB成功,第二次失敗時,第一次寫入不會被還原。至於Azure服務總線作爲交通工具,它本質上不是交易性的(即沒有DTC)。

+0

我不想用任何方式使用MSDTC,我只是感到驚訝,它被調用,因此我的問題。自從我明白服務總線的重試是如何工作的,希望路徑更清晰。 – 2014-10-28 16:49:23

0

您使用的是哪個版本的NServiceBus.Azure?你有異常的堆棧跟蹤嗎?它從何而來?

我們明確推送發送和發佈出接收事務作用域的範圍,以防止升級到DTC,以便事務對sql是本地的,所以我懷疑這是發生在這裏的事情。

從你的描述,它看起來像您使用的是不同的數據訪問實例每個處理器(每個呼叫容器的配置),你有相同的消息多個處理程序。如果這兩個打開你會看到促銷以及(即使是在同一臺服務器)的SQL一個新的連接

莫非是嗎?它拋出第二個開放?

+0

很可能。將檢查並更新接受的答案。 – 2014-10-28 16:48:05