问题:
我在做SQL的远程数据传输时,用的是链接服务器+存储过程+分布式事务进行处理的,
但存在不稳定的问题.
两台机器使用Win2000Server平台+Sql7.0,用Modem拨号做远程连接.
具体做法如下,两台SQL的MSDTC服务必须启动,设两台机器分别为数据中心A端、客户端B
在A端设置连接服务器B,B端设置链接服务器A,为了保证数据传输的准确、安全、一至性,
使用了存储过程和分布式事务(DTS TRAN),具体的事务处理过程如下
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
----处理语句 从客户端取数据写入服务器端
Insert Into [tables]
SELECT * From [Clinet].[dbo].[db].[tables]
----处理语句.....
COMMIT TRAN
SET XACT_ABORT OFF
在具体实施中发现,有时事务无法启动,提示说OLE提供者不支持分布式事务,但我查了相关
文档,文档中明确指出OLE FOR SQL 的提供者支持分布式事务。
最后发现,两台机器重启后,第一次事务正常,有一台重启后,再进行连接就会有导常,查了
相关的资料,好像有文章说到有“孤儿连接”的问题,说是计算机文件处理及网络发现客户端
已经断开,会做一些处理,保证下一次的连接,而SQL的连接由于连接速度慢,无法识别客户端
的断开,所以下次连接后事务无法正常启动.
回答:
1、本地和远程都需要启动
DISTRIBUTED TRANSACTION COORDINATOR服务。
对于存储过程,SQL Server 使用最初创建存储过程时的 SET ANSI_NULLS 设置值。无论随后何时执行存储过程,SET ANSI_NULLS 的设置都还原为其最初使用的值并生效。当在存储过程内唤醒调用 SET ANSI_NULLS 时,其设置不更改。
在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。
在执行分布式查询时应将 ANSI_WARNINGS 设置为 ON。
企业管理中的ANSI_NULLS和ANSI_WARNINGS选项不对,但没有方法改动。在查询分析器可以设置ANSI_NULLS和ANSI_WARNINGS选项,而且默认值是对的。所以能在查询分析器创建此类存储过程,而不能在企业管理器创建此类存储过程。
就是:
create proc 名
as
SET ANSI_NULL_DFLT_ON on --注意
SET ANSI_WARNINGS on
select * from open...
2、写个存储过程,使用微软的 openrowset() or openquery() 函数,别搞什么其他的冬冬,老老实实用基本的东西做就行了。这也是微软内部推荐的连接方式