避免SQL 2005和2008之间的“无法在分布式事务中使用SAVE TRANSACTION”错误

时间:2013-05-14 15:12:28

标签: sql-server sql-server-2008 msdtc

在我们的生产环境中,我们有一个存储过程(在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访问,允许远程客户端选项,还允许入站和远程DTC。出站通信,最后启用XA事务,但没有任何成功。

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

请有人帮帮我吗?

1 个答案:

答案 0 :(得分:5)

在MSDTC开启的情况下,可以轻松复制此错误:

BEGIN DISTRIBUTED TRANSACTION;

...

SAVE TRANSACTION abc;

根据this link,在SQL 7中删除了在分布式事务中使用SAVEPOINT的能力, 即SQL 2008(R2)中没有重大变化。

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

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

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