3

在我们的生产环境中,我们有一个存储过程(在 sql 2005 服务器中),它将数据从远程存储过程(存储在远程 sql 2008 中)导入到本地表中。

代码是这样的:

insert  <<local table name>> (fund, strat, clr, [id], position, unsettledPosition)
exec    <<remote stored proc name>> 'aapl us' , '2013-05-13'

我收到此错误:

不能在分布式事务中使用 SAVE TRANSACTION。

当前事务无法提交,也无法支持写入日志文件的操作。回滚事务。

我已经配置了本地和远程 DTC,允许通过网络访问 DTC,允许远程客户端选项,还允许入站和出站通信,最后启用 XA 事务,但没有任何成功。

直到昨天,远程服务器还是旧的 SQL 2005,我的代码运行良好,然后我想我错过了新服务器 2008 中的一些配置设置。

请问有人可以帮我吗?

4

1 回答 1

6

开启 MSDTC 后,此错误很容易重现:

BEGIN DISTRIBUTED TRANSACTION;

...

SAVE TRANSACTION abc;

根据此链接,在 SQL 7 中删除了在分布式事务中使用 SAVEPOINT 的能力,即 SQL 2008 (R2) 中没有重大更改。

很可能您以前没有在分布式事务下运行,但现在,例如以前,远程 proc 可能位于同一服务器上的不同数据库上,因此不需要 DTC 事务。

所以不幸的是,您似乎需要删除边界 ACID 事务,或者更改远程服务器上的 SPROC,使其不使用 SAVEPOINT。

更新 根据下面的评论,似乎已在 OP 的较新 SQL 2008 服务器上设置了REMOTE_PROC_TRANSACTIONS选项,该服务器自动开始跨远程存储过程调用的分布式事务。

于 2013-05-14T15:42:24.073 回答