关于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 |
新闻热点
疑难解答