4

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

“Cannot use SAVE TRANSACTION within a distributed transaction”

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

有谁知道解决方法?我正在使用 ole SqlServer 2000。

4

4 回答 4

0

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

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

所以不幸的是,您可能不得不删除边界 ACID 事务,或者更改SPROC远程服务器上的SAVEPOINTs.

附带说明 (尽管我已经看到您已将其标记为 SQL SERVER 2000),但要指出SQL SERVER 2008对此具有远程 proc trans 选项

于 2013-09-19T18:15:52.487 回答
0

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

于 2013-09-19T20:33:24.033 回答
0

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

于 2013-09-19T19:56:54.890 回答
0

您可以做的一件事是在开始事务之前制作远程表的本地副本。我知道这可能听起来像很多开销,但无论如何远程连接通常是一个性能问题,并且针对此问题的 SOP 修复也是制作本地副本。

于 2013-09-12T22:03:55.597 回答