接下来是MSDTC的配置,这块别漏了。打开管理工具里的组件服务,依次展开组件服务、计算机,在“我的电脑”上点右键,切到MSDTC选项卡,点“安全配置”按钮,然后在安全配置窗口里这样设置:选中“网络DTC访问”;在客户端管理里勾上“允许远程客户端”和“允许远程管理”;在事务管理通讯里选“允许入站”“允许出站”以及“不要求进行验证”;最后保证DTC登录账户是NT Authority\NetworkService。
链接服务器QPAccountsDBLink的OLE DB访问接口SQLNCLI返回登录超时错误怎么办
还有一点容易被忽略:要保证链接服务器里的语句没有访问发起事务服务器的操作。如果在发起事务的服务器上执行链接服务器上的查询、视图或存储过程时,里面又含有访问发起事务服务器的操作,这种操作叫环回(loopback),是不被支持的,所以一定要确认链接服务器中不存在这类操作。另外,在事务开始前记得加上set xact_abort ON语句,因为对大多数OLE DB提供程序(包括SQL Server)来说,隐式或显式事务中的数据修改语句都必须把XACT_ABORT设为ON,唯一不需要这个选项的情况是提供程序本身支持嵌套事务。
最后说说链接服务器和名称解析的问题,建立链接的SQL Server服务器通常有两种情况。第一种是产品直接选sql server,写法是EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server',这种情形下@server也就是linkServerName,就是你要链接的SQL Server服务器名或者IP地址。第二种是访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”,写法是EXEC sp_addlinkedserver @server='linkServerName', @srvproduct='', @provider='SQLNCLI', @datasrc='sqlServerName',这时@datasrc也就是sqlServerName,才是真正要链接的SQL Server服务器名或IP地址。SQL Server数据库引擎是通过上面设置的服务器名或IP来访问链接服务器的,DTC服务也是通过服务器名或IP去访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或IP顺利访问到链接服务器。
想用分布式事务,得先把基础环境搭好。第一步是双方都要启动MSDTC服务,因为MSDTC提供的就是分布式事务服务,只要你的数据库要用到分布式事务,参与的两台服务器都必须把这个服务开起来。第二步是打开双方的135端口,MSDTC依赖RPC服务,而RPC用的就是135端口,所以要保证RPC服务已启动,如果服务器装了防火墙,也得确保135端口没被挡住。可以用telnet加IP加135来测试对方端口通不通,也可以用端口扫描工具比如Advanced Port Scanner扫一下,判断端口到底开没开。
先别急着往DTC上想,你先检查一下你的语法是不是有错误,很可能问题根本不在DTC。另外你还需要特别注意分布式更新这件事,它本身的限制就比较多,很多报错其实是这些限制触发的,建议逐条对照排查。