避免SQL 2005和2008之间出现“Cannot use SAVE TRANSACTION within a distributed transaction”错误

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服务器中缺少一些配置设置。
请问有人可以帮助我吗?
1个回答

6

当 MSDTC 打开时,很容易重现此错误:

BEGIN DISTRIBUTED TRANSACTION;

...

SAVE TRANSACTION abc;

根据这个链接,在SQL 7中删除了在分布式事务中使用SAVEPOINT的功能,即在SQL 2008(R2)中不是一个破坏性的变化。
很可能之前您没有运行在分布式事务下,但现在是,例如以前,远程过程可能在同一服务器上的不同数据库中,因此不需要DTC事务。
所以不幸的是,似乎您需要放弃边界ACID事务,或更改远程服务器上的SPROC,使其不使用SAVEPOINT。
更新: 根据下面的评论,似乎在OP的新SQL 2008服务器上设置了REMOTE_PROC_TRANSACTIONS选项,它会自动开始跨远程存储过程调用的分布式事务。

谢谢您的回答,但在我们遇到这个错误之前,最终通过更改一些设置来解决了。但是旧的远程服务器现在已经关闭,我无法读取配置文件... - stexcec
1
可能是SET REMOTE_PROC_TRANSACTIONS - StuartLC
也许你是对的!让我明天也试试.. 目前为止,我的程序似乎运行良好。 - stexcec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接