2

我们有一个连接到另一个 SQL 服务器“server2”的 SQL Server 2008“server1”的设置。在“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”无法开始分布式事务,因此无法执行操作。

如类似问题所述: 从链接的存储过程插入到本地表 从链接的服务器插入存储过程的结果

因此,我们在两台服务器上都配置了 MSDTC。现在查询运行 20 秒,然后中止并显示错误消息:

链接服务器“server2”的 OLE DB 提供程序“SQLNCLI10”返回消息“没有事务处于活动状态。”。消息 7391,级别 16,状态 2,第 14 行 由于链接服务器“server2”的 OLE DB 提供程序“SQLNCLI10”无法开始分布式事务,因此无法执行操作。

与之前的错误相反,Windows 事件日志中没有任何内容。

首先,由于 INSERT 到本地表中,我的查询是否被视为分布式事务?

其次,如果我尝试执行这样的分布式查询:

begin distributed tran
select * from [server2].master.sys.sysprocesses
commit tran

恰好 20 秒后,我收到完全相同的错误消息。

我不知道如何从这里进一步调查。会不会是防火墙问题?

4

1 回答 1

1

如果您不需要分布式事务,上面@rs 链接中的解决方案对我有用。在这里重复解决方案:

EXECUTE sp_serveroption @server = '<remote_linked_server_name>', @optname = 'remote proc transaction promotion', @optvalue = 'false';

这告诉 sql server 实例不要将事务提升到链接服务器。请注意,这可能会产生其他后果,因此请谨慎使用。

于 2017-11-02T00:59:45.757 回答