在具有保存点的事务中,我必须与链接服务器中的表进行连接。当我尝试这样做时,我收到错误消息:
“Cannot use SAVE TRANSACTION within a distributed transaction”
远程表数据很少更改。它几乎是固定的。是否可以告诉 SqlServer 从事务中排除该表?我已经尝试过(NOLOCK)提示,但无法将此提示用于链接服务器中的表。
有谁知道解决方法?我正在使用 ole SqlServer 2000。
在具有保存点的事务中,我必须与链接服务器中的表进行连接。当我尝试这样做时,我收到错误消息:
“Cannot use SAVE TRANSACTION within a distributed transaction”
远程表数据很少更改。它几乎是固定的。是否可以告诉 SqlServer 从事务中排除该表?我已经尝试过(NOLOCK)提示,但无法将此提示用于链接服务器中的表。
有谁知道解决方法?我正在使用 ole SqlServer 2000。
根据此链接,在 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 选项。
如果您希望从 UI 级别处理事务并且您拥有 Visual Studio 2008/.net fx 3.5 或 + 框架,那么您可以使用 TransactionScope 类包装您的逻辑。如果您没有任何前端并且仅在 Sql Server 上工作,请忽略我的回答...
在这种情况下,如果分布式表不是太大,我会将其复制到临时表中。如果可能,请包括任何过滤以将行数降至最低。然后就可以正常进行了。由于数据很少更改,另一种选择是将数据复制到永久表并检查是否有任何更改,以防止每次运行事务时通过网络发送大量数据。您只能拉回最近的更改。
您可以做的一件事是在开始事务之前制作远程表的本地副本。我知道这可能听起来像很多开销,但无论如何远程连接通常是一个性能问题,并且针对此问题的 SOP 修复也是制作本地副本。