一、 問題現象
在執行 SQL Server分散式交易時,在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服務提供分散式交易服務,如果要在資料庫中使用 SQL Server分散式交易,必須在參與的雙方伺服器啟動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地址訪問到連結的伺服器。
以上的相關內容就是對 SQL Server分散式交易解決方案的介紹,望你能有所收穫。