关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试
MS DTC Report
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.TEST2005
COMMIT TRAN
/******
INSERT DATA TO REMOTE SERVER
******/
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
INSERT [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005(DES)
SELECT 'A'
COMMIT TRAN
/******
DELETE REMOTE SERVER'S DATA
******/
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
DELETE FROM [YUKON\DW].ADVENTUREWORKS.DBO.TEST2005
COMMIT TRAN
/******
UPDATE REMOTE SERVER'S DATA
******/
SET XACT_ABORT ON
BEGIN 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间不同版本间的分布式事务能够协同工作。