2010-08-12 59 views
4

我正在寫一個NServiceBus解決方案並嘗試使用DBSubcriptionStorage。這將使用NHibernate的數據訪問,我得到以下異常:NServiceBus/NHibernate需要MSDTC嗎?

合作伙伴事務管理器已禁用其遠程/網絡事務的支持

我可以使MSDTC但我的問題是:這是哪裏來自我的要求,我可以刪除它嗎?

我不熟悉NHibernate,我不知道它是否需要MSDTC或NServiceBus。 NServiceBus訂閱數據庫中只有一個扁平表,我很難在這種情況下看到MSDTC的使用。

我可以刪除MSDTC要求嗎?爲此我需要編寫自己的訂閱持久層嗎?

感謝

+3

只是爲了補充這篇文章,以防有人在尋找關於這個主題的信息:NServiceBus有一個InstallDtc配置文件,可用於根據需要自動設置系統。可以方便部署。 – 2010-08-12 04:27:36

回答

4

MSDTC是一個偉大的小動物,但可以說是相當陰險。

首先,我建議如果您知道您從未想過要成爲分佈式事務的一部分,那麼您在開發服務器上將其關閉。您不希望自動提升到DEV中的分佈式事務,只會發現它會殺死您的實際性能或在生產中無法正常工作。

話雖這麼說,答案是一樣的NHibernate的ORM不這樣做,但它很可能得到MSDTC參與,如果這些條件之一:

  • 要查詢內部的視圖/表交易鏈接到另一臺服務器。
  • 您正在使用兩個SqlConnections(或不管它是NHibernate的使用)單一的TransactionScope
  • 你爭取其他事務性組件(如MSMQ或事務文件系統),一個TransactionScope內內。

如果滿足這些條件中的任何一個(當然還有其他一些我已經忘記了),您的交易將自動提升爲分佈式交易,並且MSDTC必然會涉及。這意味着,不僅MSDTC必須爲您的箱子進行工作和配置,還必須針對所有想要參與交易的箱子進行配置。在一個簡單的SQL Serve場景中,這意味着您的應用服務器和SQL Server都需要運行它併爲分佈式事務配置它。

我不熟悉NServiceBus,但我傾向於認爲它會有各種功能,這些功能會將事務放置在隊列中。

+0

感謝您提供詳細信息,它的確有助於理解背後的原因。 NServiceBus基於MSMQ,因此可能是.. – 2010-08-12 04:30:46

+5

NServiceBus使用DTC運行數據庫調用,並在同一個tx中從其輸入隊列中刪除消息。訂閱與其他所有消息到達同一輸入隊列的事實意味着您必須放棄所有消息的ACID行爲,請將msmqtransport配置爲非事務性的以實現此目的,以便不使用DTC。這就是說,保證上述一致性的能力是恕我直言,NSB的關鍵賣點之一,所以會建議你堅持交易隊列,並啓用DTC – 2010-08-12 05:27:11

+0

「首先,我建議如果你知道你不想成爲分佈式事務EVER的一部分,您在開發服務器上將其關閉「 您無法給出原因。 – Paco 2010-08-12 09:02:19