server|分布式
關於SQL Server 2000和SQL Server 2005分散式交易能否協同工作的測試
MS DTC Report
1. MS DTC 背景
2. MSDTC 測試目的
3. MSDTC 測試環境
3.1 本次驗證測試環境:
3.2 環境配置
3.3 驗證MSDTC
3.4 建立驗證用表
4. Linked Server測試
5. 結論
1. MS DTC 背景
主持結婚典禮的牧師先問新娘和新郎“願意此人成為您的配偶嗎?” 如果他們都回答“願意”,牧師就會宣布他們結婚。
這個情景說明了事務的基本原理:幾個獨立的實體必須達成一致。如果任何一方不同意,交易就會失敗。一旦同意後,事務就會發生。Microsoft Distributed Transaction Coordinator (MS? DTC) 為 COM 結構的其它組件執行這項事務協調任務。在MS DTC,執行者被稱為交易管理員。在執行事務保護資源的事務中,其參與者(如關聯式資料庫)被稱為資源管理員。
應用程式通過調用交易管理員的 Begin Distributed Transaction 方法開始事務。這樣可建立一個代表事務的事務對象。然後應用程式會調用資源管理員來完成事務工作。當某個資源管理員首先代表某個事務工作時,會通過調用交易管理員“登記”到該事務中。隨著事務的發展,交易管理員會跟蹤每個登記到該事務中的資源管理員。當應用程式成功地完成事務的工作後,它會調用 MS DTC 來“提交”事務。然後 MS DTC 會仔細檢查“兩階段” “提交協議”,使所有已登記的資源管理員都提交。兩階段交易認可協議可確保所有的資源管理員提交此事務,或全都放棄此事務。在第一階段,MS DTC 詢問每個資源管理員是否“準備”提交。如果所有參與者都回答“是”,那麼在第二階段 MS DTC 將向所有參與者廣播提交資訊。如果事務的任何部分失敗,或資源管理員響應準備請求失敗,或資源管理員響應“否”,。則調用 Abort 事務方法,該方法可以撤消事務的操作
2. MSDTC 測試目的
通過進行SQL Server 2005和本機SQL Server 2000執行個體間及和其它獨立SQL Server 2000電腦的分散式交易的測試來驗證SQL Server不同版本間分散式交易的相容性及可行性。
3. MSDTC 測試環境
3.1 本次驗證測試環境:
? 一台真正的電腦(SQL Server 2000)
? 一台虛擬機器(裝有SQL Server 2000預設執行個體及SQL Server 2005具名執行個體)
? 測試載入器:DTCTest &DTCPing
3.2 環境配置
1.關閉兩台電腦的防火牆
2.開啟SQL Server 2005伺服器端的TCP監聽
3.開啟SQL Server2005遠端連線
4. 如下設定MSDTC
3.3 驗證MSDTC
首先使用DTC Test來驗證兩台電腦DTC是不是工作正常,在兩台電腦上各建一個ODBC Datasource,在命令列下運行DTCTEST
確認MSDTC工作正常
3.4 建立驗證用表
1. 在SQL Server 2005的AdventureWorks資料庫中使用如下指令碼建立表,此表用於以後的MSDTC的插入,刪除,更改及查詢測試:
CREATE TABLE DBO.TEST2005
(
ID1 INT IDENTITY(1,1),
DES VARCHAR(100)
)
2. 在SQL Server 2000的Pubs資料庫中使用如下指令碼建立表,此表用於以後的MSDTC的插入,刪除,更改及查詢測試:
CREATE TABLE DBO.TEST2000
(
ID1 INT IDENTITY(1,1),
DES VARCHAR(100)
)
4. Linked Server測試
4.1 SQL Server2005中加入SQL Server 2000 連結的伺服器,並進行相應的測試
在SQl Server 2005中,使用嚮導或者以下指令碼來建立一個Linked Server,使此Linked Server指向SQL Server 2000資料庫misdbs01
/****** Object: LinkedServer [MISDBS01] Script Date: 10/27/2005 17:39:33 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'MISDBS01', @srvproduct=N'SQL Server'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MISDBS01', @optname=N'use remote collation', @optvalue=N'true'
在SQL Server 2005中展開物件瀏覽器到Linked Server 目錄下,可以看到已經有一個叫misdbs01的linked server存在,下面對此linked server進行驗證。驗證步驟將分別用SELECT,DELETE,UPDATE,INSERT來對SQL Server 2000 中PUBS資料庫下的test2000進行相應操作。
/******
RETRIVE DATA FROM REMOTE SERVER
******/
BEGIN DISTRIBUTED TRAN
SELECT * FROM MISDBS01.PUBS.DBO.TEST2000
COMMIT TRAN
/******
INSERT DATA TO REMOTE SERVER
******/
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
INSERT MISDBS01.PUBS.DBO.TEST2000(DES)
SELECT 'A'
COMMIT TRAN
/******
DELETE REMOTE SERVER'S DATA
******/
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
DELETE FROM MISDBS01.PUBS.DBO.TEST2000
COMMIT TRAN
/******
UPDATE REMOTE SERVER'S DATA
******/
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
UPDATE MISDBS01.PUBS.DBO.TEST2000
SET DES='B'
COMMIT TRAN
同理驗證YUKON\DW串連本地的SQL Server 2000預設執行個體,也是成功的。
上面的測試全部正常工作,由此可見測試可見MSDTC是能夠正常工作的,從Linked Server的建立指令碼中我們也可以發現其實SQL Server 2005中使用的SQL Native Client provider來串連SQL Server 2000的,參照MSDN中的如下描述,我們可以知道能夠正常成功是正常的:
The following table shows the OLE DB providers that have been tested with SQL Server distributed queries. All these providers support being referenced in a SELECT statement by specifying a pass-through query in the OPENQUERY and OPENROWSET functions.
| Data source |
Provider name |
Use in four-part names |
Use in pass-through queries and commands |
Use in INSERT, UPDATE, or DELETE |
Use in distributed transactions |
| SQL Server 7.0 or later |
Microsoft SQL Native Client OLE DB Provider |
Yes |
Yes |
Yes |
Yes |
4.2
SQL Server2000
中加入
SQL Server 2005
連結的伺服器,並進行相應的測試
先在SQL Server 2000企業管理器或者直接使用T-SQL語句新增加一個Linked Server,此Linked Server指向SQL Server 2005. 在SQL Server 2000中展開物件瀏覽器到Linked Server 目錄下,可以看到已經有一個叫YUKON\DW的linked server存在,下面對此linked server進行驗證。驗證步驟將分別用SELECT,DELETE,UPDATE,INSERT來對SQL Server 2005 中AdventureWorks資料庫下的test2005進行相應操作。 /****** RETRIVE DATA FROM REMOTE SERVER ******/BEGIN DISTRIBUTED TRAN SELECT * FROM [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005COMMIT TRAN/****** INSERT DATA TO REMOTE SERVER ******/SET XACT_ABORT ONBEGIN DISTRIBUTED TRAN INSERT [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005(DES) SELECT 'A'COMMIT TRAN/****** DELETE REMOTE SERVER'S DATA ******/ SET XACT_ABORT ONBEGIN DISTRIBUTED TRAN DELETE FROM [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005 COMMIT TRAN /****** UPDATE REMOTE SERVER'S DATA ******/SET XACT_ABORT ONBEGIN DISTRIBUTED TRAN UPDATE [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005 SET DES=’B’COMMIT TRAN由上面的測試可以看出由本機SQL Server 2000串連連結到SQL Server 2005的過程也是成功的,其實現在是使用的SQLOLEDB來進行聯結的。同理驗證由其它計算的SQL Server 2000串連連結到此SQL Server 2005執行個體,經過驗證,也是可以正常工作的,可見SQL Server 2005依然在這方面支援SQL Server2000的Provider.
4.
結論
可見SQL Server 2000和SQL Server 2005間不同版本間的分散式交易能夠協同工作。