我们有一个SQL Server 2008“server1”的设置链接到另一个SQL服务器“server2”。 在“server2”上,有一个存储过程,我可以从“server1”查询得很好:
EXEC [server2].[xx].[dbo].[sp] param
但是,一旦我开始从链接服务器SP插入数据,我们就会遇到问题。 我们使用以下代码:
INSERT INTO server1.dbo.table (column1, column2, ...)
EXEC [server2].[xx].[dbo].[sp] param
当我们开始时,我们收到了“已知”错误,例如:
链接服务器“linkedserver”的OLE DB提供程序“SQLNCLI”返回消息“伙伴事务管理器已禁用其对远程/网络事务的支持。”。消息7391,级别16,状态2,行2无法执行操作,因为链接服务器“linkedserver”的OLE DB提供程序“SQLNCLI”无法启动分布式事务。
如类似问题所述: inserting to a local table from a linked stored procedure Inserting Results Of Stored Procedure From Linked Server
因此,我们在两台服务器上配置了MSDTC。现在查询运行20秒,然后中止并显示错误消息:
链接服务器“server2”的OLE DB提供程序“SQLNCLI10”返回消息“没有事务处于活动状态。”。 Msg 7391,Level 16,State 2,Line 14 无法执行该操作,因为链接服务器“server2”的OLE DB提供程序“SQLNCLI10”无法开始分布式事务。
与以前的错误相反,Windows事件日志中没有任何内容。
首先,由于INSERT进入本地表,我的查询被视为分布式事务吗?
其次,如果我尝试执行这样的分布式查询:
begin distributed tran
select * from [server2].master.sys.sysprocesses
commit tran
我在20秒后收到完全相同的错误消息。
我不知道如何从这里进一步调查。这可能是防火墙问题吗?
答案 0 :(得分:0)
如果您不需要分发交易,上面@ rs链接的解决方案适合我。在这里重复解决方案:
EXECUTE sp_serveroption @server = '<remote_linked_server_name>', @optname = 'remote proc transaction promotion', @optvalue = 'false';
这告诉sql server实例不要将事务提升到链接服务器。请注意,这可能会产生其他后果,因此请慎重使用。