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 |