天天看點

sql server分布式事務解決方案[新事務不能登記到指定的事務處理器中錯誤]

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>

适用環境

作業系統:windows 2003,xp

資料庫:sql server 2000/sql server 2005

使用連結伺服器進行遠端資料庫通路的情況

一、 問題現象

在執行分布式事務時,在sql server 2005下收到如下錯誤:

消息 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]。

二、 解決方案1.        雙方啟動MSDTC服務

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服務隻通過伺服器名位址通路連結伺服器,是以要保證資料庫引擎和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位址,同樣不需要做域名解析工作。

7.       遠端伺服器上的名稱解析

分布式事務的參與伺服器是需要互相通路的,發起查詢的伺服器要根據機器名或ip查找遠端伺服器的,同樣遠端伺服器也要查找發起伺服器,遠端伺服器通過發起伺服器的機器名查找伺服器,是以要保證遠端伺服器能夠通過發起伺服器的機器名通路到發起伺服器。

一般的,兩個伺服器在同一網段機器名能就行很好的解析,但是也不保證都能很好的解析,是以比較保險的做法是:

在遠端伺服器的在“C:\WINDOWS\system32\drivers\etc\hosts”檔案中增加一條記錄:

xxx.xxx.xxx.xxx   發起伺服器名

本文轉自 netcorner 部落格園部落格,原文連結:http://www.cnblogs.com/netcorner/archive/2010/11/10/2911985.html   ,如需轉載請自行聯系原作者