在windows2003下執行分佈式事務的時候出現以下狀況。sql
1、 問題現象
在執行分佈式事務時,在sql server 2005下收到以下錯誤:數據庫
連接服務器"xxxxxxx"的 OLE DB 訪問接口 "SQLNCLI" 返回了消息 "沒有活動事務。"。windows
消息 7391,級別 16,狀態 2,過程 xxxxx,第 16 行瀏覽器
沒法執行該操做,由於連接服務器 "xxxxx" 的 OLE DB 訪問接口 "SQLNCLI" 沒法啓動分佈式事務。安全
在sql server 2000下收到以下錯誤:服務器
該操做未能執行,由於 OLE DB 提供程序 'SQLOLEDB' 沒法啓動分佈式事務。網絡
[OLE/DB provider returned message: 新事務不能登記到指定的事務處理器中。 ]分佈式
OLE DB 錯誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。ide
2、 解決方案-------使用DCTPing工具檢測
1. 雙方啓動MSDTC服務--DTC、RPC服務
MSDTC服務提供分佈式事務服務,若是要在數據庫中使用分佈式事務,必須在參與的雙方服務器啓動MSDTC(Distributed Transaction Coordinator)服務。工具
2. 打開雙方135端口(或關閉防火牆)
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啓動,若是服務器有防火牆,保證135端口不被防火牆擋住。
使用「telnet IP 135 」命令測試對方端口是否對外開放。也可用端口掃描軟件(好比Advanced Port Scanner)掃描端口以判斷端口是否開放。
3. 保證連接服務器中語句沒有訪問發起事務服務器的操做
在發起事務的服務器執行連接服務器上的查詢、視圖或存儲過程當中含有訪問發起事務服務器的操做,這樣的操做叫作環回(loopback),是不被支持的,因此要保證在連接服務器中不存在此類操做。
4. 在事務開始前加入set xact_abort ON語句
對於大多數 OLE DB 提供程序(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置爲 ON。惟一不須要該選項的狀況是在提供程序支持嵌套事務時。
5. MSDTC設置
打開「管理工具――組件服務」,以此打開「組件服務――計算機」,在「個人電腦」上點擊右鍵。在MSDTC選項卡中,點擊「安全配置」按鈕。
在安全配置窗口中作以下設置:
l選中「網絡DTC訪問」
l在客戶端管理中選中「容許遠程客戶端」「容許遠程管理」
l在事務管理通信中選「容許入站」「容許出站」「不要求進行驗證」
l保證DTC登錄帳戶爲:NT Authority\NetworkService
6. 連接服務器和名稱解析問題
創建連接sql server服務器,一般有兩種狀況:
l第一種狀況,產品選」sql server」
EXEC sp_addlinkedserver
@server='linkServerName',
@srvproduct = N'SQL Server'
這種狀況,@server (linkServerName)就是要連接的sqlserver服務器名或者ip地址。
l第二種狀況,訪問接口選「Microsoft OLE DB Provider Sql Server」或「Sql Native Client」
EXEC sp_addlinkedserver
@server=' linkServerName ',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='sqlServerName'
這種狀況,@datasrc(sqlServerName)就是要連接的實際sqlserver服務器名或者ip地址。
Sql server數據庫引擎是經過上面設置的服務器名或者ip地址訪問連接服務器,DTC服務也是經過服務器名或者ip地址訪問連接服務器,因此要保證數據庫引擎和DTC都能經過服務器名或者ip地址訪問到連接服務器。
數據庫引擎和DTC解析服務器的方式不太同樣,下面分別敘述
6.1 數據庫引擎
第一種狀況的@server或者第二種狀況的@datasrc設置爲ip地址時,數據庫引擎會根據ip地址訪問連接服務器,這時不須要作名稱解析。
第一種狀況的@server或者第二種狀況的@datasrc設置爲sql server服務器名時,須要作名稱解析,就是把服務器名解析爲ip地址。
有兩個辦法解析服務器名:
一是在sql server客戶端配置中設置一個別名,將上面的服務器名對應到連接服務器的ip地址。
二是在「C:\WINDOWS\system32\drivers\etc\hosts」文件中增長一條記錄:
xxx.xxx.xxx.xxx 服務器名
做用一樣是把服務器名對應到連接服務器的ip地址。
6.2 DTC
無論哪種狀況,只要@server設置的是服務器名而不是ip地址,就須要進行名稱解析,辦法同上面第二種辦法,在hosts文件中增長解析記錄,上面的第一種辦法對DTC不起做用。
若是@server設置的是ip地址,一樣不須要作域名解析工做。
=======================================================================
以上是我從網上轉的,其實在設置MSDTC安全那部分,容許遠程客戶端這個能夠不勾選,但最重要的是下面那一步,在事務管理通信中選「容許入站」「容許出站」「不要求進行驗證」,在windows2003中默認的是選的第一項要求對雙方進行驗證,我遇到的狀況,把這個改過來就不會再報錯了。另外下面的那個登陸用戶只能用那個network service,用別的在sqlserver裏就會說msdtc不可用。
=======================================================================
++++++++++++++++++++++++【如下爲我的內容】++++++++++++++++++++++++++++++++++++
=======================================================================
文章轉自網絡,http://sai5d.blog.163.com/blog/static/62225483200901322939411/ 以上顏色標註的文字爲須要注意的地方,其餘的通常默認就OK,整體來講配置不一樣服務器間的觸發器MSDTC須要注意三個方面,上面server2003是一個,下面還有兩個:host解析、msdtc拒絕訪問-------這些都先用採用DTCPing工具測試連通性
備註:hosts解析不能即時生效的問題和文章標題這個問題通常都是出如今server2003上,在server2008上就不多見了,但msdtc拒絕訪問問題是win七、server2008上常見。
另外附windows server 2003 【hosts文件更改後,不生效】的解決辦法:
打開本地鏈接的 Internet(TCP/IP)協議的屬性頁,點擊常規選項卡中的高級按鈕,選擇WINS選項卡,勾選「啓用 LMHOSTS 查詢」,接着按下「導入 LMHOSTS」按鈕,導入C:/WINDOWS/system32/drivers/etc下的hosts文件,這樣再次啓動瀏覽器時,就會發現網站都 被屏蔽了,hosts文件生效了。
--轉自http://blog.csdn.net/jaycxing/article/details/5286150
【MSDTC拒絕訪問】的解決方法:
---轉自http://blog.csdn.net/xvhaijun/article/details/4505461