使用SQL SERVER的Link Server實現分散式事務
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'
GO
EXEC sp_addlinkedsrvlogin 'cpserver', 'false', NULL, 'sa', '123'
GO
-- 在第二個伺服器cpserver(Windows 2003 Server)上建立連結伺服器
EXEC sp_addlinkedserver 'xiaodi', 'ms', 'SQLOLEDB', '75.81.2.37'
GO
EXEC sp_addlinkedsrvlogin 'xiaodi', 'false', NULL, 'sa', '123'
GO
-- 連線發起伺服器xiaodi 75.81.2.37,建立儲存過程
use ksoa_demo
GO
if exists(select top 1 1 from sysobjects where xtype='P' and name = 'dtc_test')
drop procedure dct_test
GO
create procedure dtc_test
as
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 OFF
go
-- 連線第二個伺服器cpserver 75.81.1.220,建立儲存過程
use ksoa_test_quyu
GO
if exists(select top 1 1 from sysobjects where xtype='P' and name = 'dtc_test')
drop procedure dtc_test
GO
create procedure dtc_test
as
begin tran dtc_test1
update bmdoc set bm = '人力資源部1' where bmid = 'DBM00000053'
commit tran dtc_test1
go
-- 連線發起伺服器xiaodi,執行儲存過程
exec dtc_test
-- 檢視結果
select * from [test2005].ksoa_test_quyu.dbo.bmdoc
select * from bmdoc
-- 注:如果第二個伺服器cpserver上的語句執行失敗,那麼發起服務