1. 程式人生 > >使用SQL SERVER的Link Server實現分散式事務

使用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上的語句執行失敗,那麼發起服務