欢迎进入windows社区论坛,与300万技术人员互动交流 >>进入
如果在windows.netserver上安装的sqlserver2000中运行链接服务器查询,可能会返回下列错误(即使msdtc正在该服务器上运行):
症状如果在windows.netserver上安装的sqlserver2000中运行链接服务器查询,可能会返回下列错误(即使msdtc正在该服务器上运行):server:msg8501,level16,state3,line3 msdtconserver'servername'isunavailable.在sqlserver错误日志中,您会发现由运行该查询的spid引发的下列错误:resourcemanagercreationfailed:resultcode=0x8004d01c原因这是设计使然。如果在本地系统帐户下运行分布式事务处理协调器服务就会发生此错误。解决方案最近为了提高rpc安全性对dtc所做的更改要求msdtc作为ntauthority\networkservice运行。这是。netserver的默认选项。在windowsnt和windows2000中,默认情况下msdtc服务是在本地系统帐户下运行的。
警告:注册表编辑器使用不当可造成严重问题,这些问题可能需要重新安装操作系统。microsoft不保证能够解决因为注册表编辑器使用不当而产生的问题。使用注册表编辑器需要您自担风险。
若要将msdtc服务帐户从本地系统更改为ntauthority\networkservice,请执行下列步骤:1.运行regedt32,浏览至hkey_local_machine\software\microsoft\msdtc.添加一个dword值turnoffrpcsecurity,值数据为1.2.打开命令提示,运行netstopmsdtc,然后运行netstartmsdtc.3.转至组件服务管理工具.
a.浏览至启动管理工具.
b.选择组件服务.
c.展开组件服务树,然后展开我的电脑.
d.右键单击我的电脑,然后选择属性.
e.在msdtc选项卡中,确保选中了下列选项:网络dtc访问网络管理网络事务xa事务另外,dtc登录帐户一定要设置为ntauthority\networkservice.
f.单击确定.这样将会提示您msdtc将会停止并重新启动。所有的依赖服务将被停止。请按'是'继续.单击是继续。
g.单击确定关闭我的电脑属性窗口。
4.再次运行regedt32,浏览至hkey_local_machine\software\microsoft\msdtc,然后删除turnoffrpcsecurity项。现在您的msdtc服务应该在ntauthority\networkservice帐户下运行了,并且不会再出现该错误。
更多信息当msdtc安全性配置下的网络dtc访问禁用时,如果运行链接服务器查询则会返回下列错误:server:msg7391,level16,state1,line2theoperationcouldnotbeperformedbecausetheoledbprovider'sqloledb'
wasunabletobeginadistributedtransaction.[ole/dbproviderreturnedmessage:newtransactioncannotenlistinthespecifiedtransactioncoordinator.]
跟踪标记7300打开时:server:msg7391,level16,state1,line2theoperationcouldnotbeperformedbecausetheoledbprovider'sqloledb'
wasunabletobeginadistributedtransaction.[ole/dbproviderreturnedmessage:newtransactioncannotenlistinthespecifiedtransactioncoordinator.]oledberrortrace[ole/dbprovider'sqloledb'itransactionjoin::jointransactionreturned0x8004d00a].
msdtc服务一定要按照上面解决方案一节中的说明进行设置,才能防止此错误。
再现现象的步骤
1.转至启动管理工具服务.
2.右键单击分布式事务处理协调器服务,转至登录选项卡,选择登录身份下的本地系统帐户。
3.停止然后重新启动该服务。
4.从查询分析器,运行下列脚本:execsp_addlinkedserverremote1execsp_setnetnameremote1,goexecremote1.pubs.dbo.sp_executesqln'createtablet(c1int)'gosetxact_abortongobegintraninsertintoremote1.pubs.dbo.tvalues(1)committrango
