1. 程式人生 > >MSDTC 分散式事務錯誤解決

MSDTC 分散式事務錯誤解決

  最近 在做專案的過程中總會遇到MSDTC的錯誤,網上也很多人問到這個問題,錯誤資訊大約描述為:

[COMException (0x8004d00e): 此事務已明地或暗地被確認或終止 (異常來自 HRESULT:0x8004D00E)]
   System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer) +0
   System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts) +237

[TransactionException: 事務已被隱式或顯式提交,或已終止。]
   System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException) +412
   System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts) +292
   System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) +527
   System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx) +801124
   System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) +795031
   System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) +30
   System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +1205
   System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +82
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +105
   System.Data.SqlClient.SqlConnection.Open() +111

一般都是使用.net 2.0 下的Transactionscope引起的,通過搜尋,大部分給出的答案是:

win2003預設禁用遠端/網路事務,啟用的步驟如下:    
  啟用網路   DTC   訪問的步驟    
  1.   單擊“開始”,指向“控制面板”,然後單擊“新增/刪除程式”。    
  2.   單擊“新增/刪除   Windows   元件”。    
  3.   選擇“應用程式伺服器”,然後單擊“詳細資訊”。    
  4.   選擇“啟用網路   DTC   訪問”,然後單擊“確定”。    
  5.   單擊“下一步”。    
  6.   單擊“完成”。    
  7.   停止分散式事務協調器服務,然後重新予以啟動。    
  8.   停止參與分散式事務的任何資源管理器服務(如   Microsoft   SQL   Server   或   Microsoft   Message   Queue   Server),然後重新予以啟動。     
   

這樣做下來,我相信大部分人還是不行,再經過一番搜尋,原來還需要兩臺機器能夠ping的通hostname,這裡還需要設定%windir%/WinNT/System32/Drivers/下的host檔案,寫上IP和HostName的對應資訊,如

192.168.0.6 myhostname

請確保這一點: 兩臺機器能夠ping通機器名(不是IP)

這裡要特別注意你的防火牆,它有可能能讓你ping不同機器名,更可能讓兩臺機器之間禁止RPC服務,可見下面的一段資料:


If pinging Server2 from Server1 by NetBios name fails, or if pinging Server2 from Server1 by NetBios name succeeds but the DTCPing test shows RPC communication still fails, it is possible that Port 135 (the End Point Mapper, or EPM) has not been opened bi-directionally on the firewall. Check the firewall to make sure that the EPM is open in both directions. At this point, a Network Monitor trace may help to pinpoint the problem.

你也可以使用DTCping工具來測試是否可以在兩臺機器之間使用MSDTC,並幫你分析原因,下載地址可以到微軟的站點