ansi_warning和ansi_nulls 兩個選項必須開啟,好像對系統也沒啥影響。
樓主再檢查一下兩個地方,經測試,在要使用分散式交易時,這是必須要設定的。
1、連結的伺服器和名稱解析問題
-- 建立連結的伺服器
EXEC sp_addlinkedserver 'srv_lnk', 'ms', 'SQLOLEDB', '192.168.1.1'
GO
-- 建立連結的伺服器上遠程登入之間的映射
EXEC sp_addlinkedsrvlogin 'srv_lnk', 'false', NULL, 'sa', '123'
GO
在“C:\WINDOWS\system32\drivers\etc\hosts”檔案中增加記錄:
xxx.xxx.xxx.xxx 伺服器名
xxx.xxx.xxx.xxx 發起伺服器名
2、防火牆設定
雙方防火牆都添加例外程式c:\windows\system32\msdtc.exe
在電腦上已啟用 Windows 防火牆。 預設情況下, Windows 防火牆阻止 MSDTC 程式。
請注意 即使在關閉 Windows 防火牆,可能會出現此問題
------------------------------------------------------------------------------------
SQL Server 2005分散式交易環境搭建
一、 運行批次程式,安裝並啟動msdtc服務
@echo off
setlocal
@echo %WINDIR%\System32\msdtc.exe -uninstall
%WINDIR%\System32\msdtc.exe -uninstall
call :delkey "HKCR\CID"
call :delkey "HKLM\SYSTEM\CurrentControlSet\Services\MSDTC"
call :delkey "HKLM\SYSTEM\ControlSet001\Services\MSDTC"
call :delkey "HKLM\SYSTEM\ControlSet002\Services\MSDTC"
call :delkey "HKLM\Software\Microsoft\MSDTC"
@echo %WINDIR%\System32\msdtc.exe -install
%WINDIR%\System32\msdtc.exe -install
endlocal
goto :EOF
:delkey
set key=%1
call :delkeyq %key% >nul 2>&1
@echo.
goto :EOF
:delkeyq
REG Delete %key% /F
二、 開啟雙方防火牆中的35連接埠(Remote Procedure Call)
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135連接埠,保證RPC服務啟動,如果伺服器有防火牆,保證135連接埠不被防火牆擋住。 使用“telnet IP 135 ”命令測試對方連接埠是否對外開放。也可用連接埠掃描軟體(比如Advanced Port Scanner)掃描連接埠以判斷連接埠是否開放。
在兩個伺服器上分別開啟RPC OUT選項
Code:sql
1 |
exec sp_serveroption 'test2005', 'rpc out', 'true |
三、 保證連結的伺服器中語句沒有訪問發起事務伺服器的操作
在發起事務的伺服器執行連結的伺服器上的查詢、視圖或預存程序中含有訪問發起事務伺服器的操作,這樣的操作叫做環回(loopback),是不被支援的,所以要保證在連結的伺服器中不存在此類操作。
四、 在事務開始前加入SET xact_abort ON語句
對於大多數 OLE DB 提供者(包括 SQL Server),必須將隱式或顯示事務中的資料修改語句中的 XACT_ABORT 設定為 ON。唯一不需要該選項的情況是在提供者支援嵌套事務時。
五、 MSDTC設定
開啟“管理工具――元件服務”,以此開啟“元件服務――電腦”,在“我的電腦”上點擊右鍵。在MSDTC選項卡中,點擊“安全配置”按鈕。
在安全配置視窗中做如下設定:
選中“網路DTC訪問”
在用戶端管理中選中“允許遠程用戶端”、“允許遠端管理”
在交易管理通訊中選“允許入站”、“允許出站”、“不要求進行驗證”
保證DTC登陸賬戶為:NT Authority\NetworkService
----------------------------------------------------------------------------------------------------
-- 在發起伺服器xiaodi(Windows XP)上建立連結的伺服器EXEC sp_addlinkedserver 'cpserver', 'ms', 'SQLOLEDB', '75.81.1.220'GOEXEC sp_addlinkedsrvlogin 'cpserver', 'false', NULL, 'sa', '123'GO -- 在第二個伺服器cpserver(Windows 2003 Server)上建立連結的伺服器EXEC sp_addlinkedserver 'xiaodi', 'ms', 'SQLOLEDB', '75.81.2.37'GOEXEC sp_addlinkedsrvlogin 'xiaodi', 'false', NULL, 'sa', '123'GO -- 串連發起伺服器xiaodi 75.81.2.37,建立預存程序use ksoa_demoGOif exists(select top 1 1 from sysobjects where xtype='P' and name = 'dtc_test')drop procedure dct_testGOcreate procedure dtc_testas set xact_abort ON begin distributed tran dtc_test update bmdoc set bm = '公司管理部1' where bmid = 'DBM00000001' exec [test2005].ksoa_test_quyu.dbo.dtc_test commit tran dtc_test set xact_abort OFFgo-- 串連第二個伺服器cpserver 75.81.1.220,建立預存程序use ksoa_test_quyuGOif exists(select top 1 1 from sysobjects where xtype='P' and name = 'dtc_test')drop procedure dtc_testGO create procedure dtc_testas begin tran dtc_test1 update bmdoc set bm = '人力資源部1' where bmid = 'DBM00000053' commit tran dtc_test1go-- 串連發起伺服器xiaodi,執行預存程序exec dtc_test -- 查看結果select * from [test2005].ksoa_test_quyu.dbo.bmdocselect * from bmdoc-- 註:如果第二個伺服器cpserver上的語句執行失敗,那麼發起服務