如何使用跨越多个服务器链接的程序的事务?

时间:2009-01-15 20:46:23

标签: sql-server-2005 tsql transactions

我正在尝试测试我们的某个供应商向我们提供访问其产品数据库的提议,并且它涉及跨多个服务器的查询和事务。我以前从未直接在数据库上做过这件事,坦率地说,我很无能为力,所以我试图模仿一个证据,证明这至少在概念上是有效的。

我有两个SQL Server 2005服务器。让我们为了论证的缘故,将它们称为Server1和Server2 [掌握你的掌声],每个都包含一个虚拟数据库。 Server1上的虚拟数据库称为Source,而Server2上的虚拟数据库称为Destination,只是为了简单起见。每个数据库分别拥有一个名为Input和Output的表,所以结构就像这样准解释:

  • Server1.Source.dbo.Input
  • Server2.Destination.dbo.Output

我在Server2上有一个名为WriteDataToOutput的存储过程,它接收一个Varchar参数并将其内容写入输出表。

现在诡计开始了:

  1. 我想在Server1.Source上创建一个存储过程,它调用Server2上定义的WriteDataToOutput存储过程,这看似简单的步骤。
  2. 我希望这个调用成为事务的一部分,这样如果调用它的过程失败,整个事务就会被回滚。
  3. 在这里,我知道该怎么做。谁能指出我正确的方向?我在同一台服务器上的两个不同的数据库上尝试了这个,它运行得很好,让我认为它可以在不同的服务器上工作,问题是,我该如何做这样的事情?我从哪里开始?

6 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

正如其他人所说,我同意链接服务器是最佳选择。

以下是我第一次处理链接服务器时遇到的一些指示:

  • 如果链接服务器是实例,请确保将名称括起来。例如[SERVERNAME \ INSTANCENAME]。

  • 使用链接服务器中的表或视图的别名,否则将出现“无法绑定多部分标识符”错误。 4部分命名约定有限制。例如,SERVER.DATABASE.dbo.TABLE.FIELD有五个部分,将给出错误。但是,SELECT linked.FieldName FROM SERVER.DATABASE.dbo.TABLE AS linked可以正常使用

答案 2 :(得分:3)

对于步骤2,您需要运行分布式事务处理协调器,还需要使用SET XACT_ABORT ON以确保它将全部回滚 你还需要启用在2005年及以后默认关闭的RPC

有很多东西可以咬你的脖子

答案 3 :(得分:2)

MSDN表示如果使用命令BEGIN DISTRIBUTED TRANSACTION,您可以跨链接服务器进行交易。

我记得我在链接服务器上遇到了一个称为存储过程的问题,但我解决了这个问题,而不是解决它。

答案 4 :(得分:1)

使用链接服务器,您可以使用DTC(Distributed Transactino Coordinator)在单个事务中的任一服务器上运行存储过程。你肯定想做一些性能分析。我发现一些使用链接的SP可能会大大降低数据库性能,尤其是当您尝试从两台服务器中的每一台加入结果集时。

答案 5 :(得分:0)

设置链接服务器,然后您应该能够跨服务器执行选择/插入/更新。类似的东西:

INSERT INTO Server2.Destination.dbo.Output
SELECT * FROM Input  
WHERE <Criteria>

这假设您正在运行Server1.Source中的查询,因此您不需要完全符合条件。