无法执行该操作,因为OLE DB提供程序" SQLNCLI11"对于链接服务器无法启动分布式事务

时间:2014-06-03 12:03:48

标签: sql-server distributed-transactions msdtc

我尝试从我的计算机(SQL Server 2012)运行分布式事务到客户端服务器(SQL Server 2008)。

我试图跑:

begin distributed transaction
select * from [172.01.01.01].master.dbo.sysprocesses
Commit Transaction

我得到了:

OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" was unable to begin a distributed transaction.

我可以使用返回的数据运行SELECT到该服务器,所以至少我知道服务器可以看到对方,并且链接服务器存在且正在运行

现在,网上有多个帖子,但我无法让它发挥作用。这是我到目前为止所尝试的: 1.将DTC属性设置为以下(在两台服务器上) enter image description here

  1. 从控制面板重新启动分布式事务处理协调器(MSDTC) - >服务(在两台服务器上)。

  2. 卸载并安装DTC(在两台服务器上)。

  3. 重新启动远程服务器。

  4. 关闭两台服务器上的防火墙。

  5. 启用sp_configure' Ad Hoc Distributed Queries',1(在两台服务器上)。

  6. 我运行了DTCPing并且成功了。

  7. 链接的服务器属性已更改为以下内容: enter image description here

  8. 还有什么可以尝试的?

    更新: 将事务从另一台服务器运行到172.01.01.01。 因此,问题不在目标服务器上,而是在我的作为源的计算机上。

6 个答案:

答案 0 :(得分:5)

我遇到了类似的问题,我解决了如下问题。 SQL Server中的对象资源管理器的树结构中有一个节点。在那里你会发现Serverobjects→LinkedServers→下面有一个分布式服务器的IP地址列表。

右键单击它,选择属性,会弹出一个窗口。在左窗格中选择服务器选项;你会得到属性列表。将标志值false设置为“启用分布式事务的促销”属性。

答案 1 :(得分:5)

设置"启用分布式事务的推广" flag为false(在Linked Server Properties窗口中)解决了我类似的问题。

答案 2 :(得分:3)

如果根据OP的原始帖子在两个SQL服务器上配置MS分布式事务处理协调器(MSDTC)之后仍然没有事务处理",则应该检查链接服务器中注册的每个主机是否可以通过IP访问(假设您使用的是什么)。

例如;在最近的设置中,可以通过192.168.200.x范围内的网络(相同的子网)访问两个SQL服务器,但每个服务器也通过10.x.x.x范围内的IP间接连接。在一台SQL Server上,它使用的DNS服务器将目标SQL服务器解析为它的10.xxx IP(防火墙),即使链接的服务器条目使用了目标的192.168.200.x中的IP服务器。

似乎MSDTC使用服务器的主机名,而SQL Server使用链接服务器条目中定义的IP或主机名通过任何链接连接进行连接,导致在SQL中检查目标链接服务器时这种混淆的明显连接行为Management Studio,但无法在目标上执行远程过程。

解决方案是在主机文件中添加条目(%windir%\ system32 \ drivers \ etc \ hosts)以明确强制每个SQL服务器将另一个SQL服务器解析为192.168.200上的IP地址。 x网络。

在主机1(IP 192.168.200.15 )上:

# TARGET SERVER
192.168.200.20    targetserverhostname.and.any.domain.suffix  targetserverhostname

在主机2(IP 192.168.200.20

# SOURCE SERVER
192.168.200.15    sourceserverhostname.and.any.domain.suffix sourceserverhostname

请勿忘记确保已根据上面的OP屏幕截图配置MSDTC,以允许网络访问和(如果需要)无身份验证。

答案 3 :(得分:0)

在您的开始分布式事务上方尝试此SQL

set XACT_ABORT on

答案 4 :(得分:0)

我有类似的问题。经过列出的所有事情都无济于事。我们有一个集群环境,事实证明我们的DBA在集群而不是主服务器上进行服务工作。如果其他所有方法都失败,则值得牢记:-)

答案 5 :(得分:0)

条件像这样可能会导致同样的错误:

1- 运行这样的事务脚本并从链接服务器读取:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Begin Tran
... (select command from linked server)...
Commit

2- 在代码中打开一个新连接并运行一个非事务性脚本

结果:会引发错误!

解决方案:删除SET TRANSACTION ISOLATION LEVEL SERIALIZABLE