Dot-Net

關於交易和 msdtc 的混淆

  • February 5, 2012

我對事務和 msdtc 如何協同工作有一些基本的困惑。

我有一個基本的伺服器/客戶端 winforms 應用程序。該應用程序使用 transactionscope 來封裝在 sql server 上執行的幾個 sql 命令。

當我僅在伺服器上啟用 msdtc 網路訪問時,該應用程序似乎工作正常。然後有一天它停止工作,說沒有啟用網路訪問。

現在看來,我必須在客戶端電腦和伺服器上都啟用 msdtc 網路訪問才能使 transactionscope 工作。

客戶端或伺服器 msdtc 服務是否執行事務?或者兩者兼而有之?

是否有人對客戶端和伺服器上是否需要 msdtc 網路訪問或僅伺服器有指導?

如果您使用的是 MSDTC,那麼您將需要客戶端(您的應用程序)和伺服器(數據庫)來執行 MSDTC 並正確配置。

這可能是痛苦的根源,尤其是在處理防火牆時。如果您遇到問題,請參閱 MSDTC 故障排除問題。它談到了 BizTalk,但它通常適用於 MSDTC。 DTCPING也是你的朋友。

現在,如果您使用 SQL Server 2005 及更高版本,僅訪問一個數據庫,使用一個數據庫連接並且不在應用程序域之間傳遞事務,那麼您不應該要求使用 MSDTC。在這種情況下,System.Transactions 事務管理器將為您管理事務。如果出現上述任何一種情況,那麼事務將被提升為分佈式事務(事務管理器將是 MSDTC)。有關詳細資訊,請參閱事務管理升級

一般來說,如果不需要,最好避免使用 MSDTC。即,如果您只處理單個 SQL Server 2005+ 數據庫,那麼請嘗試將您的程式碼設計為不使用 MSDTC。除了配置麻煩之外,DTC 還會帶來性能損失,因為對 MSDTC 的所有呼叫都在程序外,再加上兩階段送出協議(MSDTC 使用)的成本。

就您的特定情況下發生的事情而言,很難說。如果您的程式碼沒有更改,那麼防火牆規則可能已更改?我還看到 Windows 更新更改了導致問題的 DTC 配置(出於安全考慮)。

根據評論更新:

對於監控事務提升或升級,如果您不使用任何分佈式事務,我認為您可以使用一些分佈式事務協調器性能計數器來跟踪已送出的事務。如果進行測試,您可以禁用 MSDTC 並查看您的程式碼是否失敗。另一種方法是監視 SQL Server 中的事務。從編碼的角度來看,您可以嘗試處理DistributedTransactionStarted事件並進行一些日誌記錄(但在投入生產之前刪除該程式碼)。

有關使用單個連接的程式碼範例,請轉到 MSDN 的TransactionScope頁面。基本上,創建一個 TransactionScope,創建一個 SqlConnection,對 SqlConnection 做一些工作,關閉連接,呼叫 scope.Complete()。

請注意,如果您正在使用數據適配器方法,它們會自動管理您的連接,以便連接關閉或返回到連接池。無論哪種方式,如果呼叫另一個操作,則該事務將被提升為 DTC 事務。有關更多詳細資訊,請參閱System.Transactions 和連接池

引用自:https://stackoverflow.com/questions/1564454