我尝试从我的计算机(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属性设置为以下(在两台服务器上)
从控制面板重新启动分布式事务处理协调器(MSDTC) - >服务(在两台服务器上)。
卸载并安装DTC(在两台服务器上)。
重新启动远程服务器。
关闭两台服务器上的防火墙。
启用sp_configure' Ad Hoc Distributed Queries',1(在两台服务器上)。
我运行了DTCPing并且成功了。
链接的服务器属性已更改为以下内容:
还有什么可以尝试的?
更新: 将事务从另一台服务器运行到172.01.01.01。 因此,问题不在目标服务器上,而是在我的作为源的计算机上。
答案 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
。