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

ste*_*cec 2 sql-server msdtc sql-server-2008

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

代码是这样的:

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

我收到此错误:

无法在分布式事务中使用SAVE TRANSACTION.

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

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

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

请有人帮帮我吗?

Stu*_*tLC 5

打开MSDTC后,可以轻松复制此错误:

BEGIN DISTRIBUTED TRANSACTION;

...

SAVE TRANSACTION abc;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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