關于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 | 
新聞熱點
疑難解答