将SAVE TRANSACTION与链接服务器一起使用

时间:2013-09-04 23:58:45

标签: sql-server sql-server-2000 distributed-transactions

在具有保存点的事务中,我必须与链接服务器中的表进行连接。当我尝试这样做时,我收到错误消息:

“Cannot use SAVE TRANSACTION within a distributed transaction”

远程表数据很少更改。它几乎是固定的。有可能告诉SqlServer从事务中排除这个表吗?我尝试过(NOLOCK)提示,但是无法将此提示用于链接服务器中的表。

有没有人知道解决方法?我正在使用ole SqlServer 2000.

4 个答案:

答案 0 :(得分:0)

您可以做的一件事是在启动事务之前制作远程表的本地副本。我知道这可能听起来像很多开销,但远程连接通常都是性能问题,SOP修复也是为了制作本地副本。

答案 1 :(得分:0)

根据此 link ,在SQL 7中删除了在分布式事务中使用SAVEPOINT的功能。

  

允许从Microsoft SQL Server 6.5进行应用程序迁移   Microsoft SQL中正在使用分布式事务中的保存点   Server 2000 Service Pack 1引入了一个允许a的跟踪标志   分布式事务中的保存点。跟踪标志是8599和   可以在SQL Server启动期间或在个人内部打开   session(即在使用a启用分布式事务之前)   BEGIN DISTRIBUTED TRANSACTION语句)使用DBCC TRACEON   命令。当跟踪标志8599设置为ON时,SQL Server允许您   在分布式事务中使用保存点。

所以遗憾的是,你可能要么丢弃边界ACID事务,要么更改远程服务器上的SPROC,以便它不使用SAVEPOINTs

旁注 (虽然我已经看到你已经将它标记为SQL SERVER 2000)但要指出 SQL SERVER 2008 remote proc trans Option

答案 2 :(得分:0)

在这种情况下,如果分布式表不是太大,我会将其复制到临时表。如果可能,请包含任何过滤以将行数减至最少。然后你可以正常进行。数据变化很少的另一个选择是将数据复制到永久表,并检查是否有任何更改,以防止每次运行事务时通过网络发送大量数据。你只能拉过最近的变化。

答案 3 :(得分:0)

如果您希望从UI级别处理事务并且您拥有Visual Studio 2008 / .net fx 3.5或+框架,那么您可以使用TransactionScope类包装您的逻辑。如果您没有任何前端,并且您只在Sql Server上工作,请忽略我的答案......