逐梦论坛's Archiver

shillan 发表于 2014-4-22 10:44

(转)该操作未能执行,因为 OLE DB 提供程序SQLOLEDB无法启动分布式事务...的解决

[p=30, 2, left][font=宋体]适用环境[/font]
[/p][p=30, 2, left][font=宋体]操作系统:[/font][font=Verdana]windows 2003[/font][/p][p=30, 2, left][font=宋体]数据库:[/font][font=Verdana]sql server 2000/sql server 2005[/font][/p][p=30, 2, left][font=宋体]使用链接服务器进行远程数据库访问的情况[/font][/p][font=Verdana][size=12pt]一、 [/size][/font][font=宋体][size=12pt]问题现象[/size][/font][p=30, 2, left][font=宋体]在执行分布式事务时,在[/font][font=Verdana]sql server 2005[/font][font=宋体]下收到如下错误:[/font][/p][p=30, 2, left][color=red][font=宋体]消息[/font][/color][color=red][font=Verdana] 7391[/font][/color][color=red][font=宋体],级别[/font][/color][color=red][font=Verdana] 16[/font][/color][color=red][font=宋体],状态[/font][/color][color=red][font=Verdana] 2[/font][/color][color=red][font=宋体],过程[/font][/color][color=red][font=Verdana] xxxxx[/font][/color][color=red][font=宋体],第[/font][/color][color=red][font=Verdana] 16 [/font][/color][color=red][font=宋体]行[/font][/color][/p][p=30, 2, left][color=red][font=宋体]无法执行该操作,因为链接服务器[/font][/color][color=red][font=Verdana] "xxxxx" [/font][/color][color=red][font=宋体]的[/font][/color][color=red][font=Verdana] OLE DB [/font][/color][color=red][font=宋体]访问接口[/font][/color][color=red][font=Verdana] "SQLNCLI" [/font][/color][color=red][font=宋体]无法启动分布式事务。[/font][/color][/p][p=30, 2, left][font=宋体]在[/font][font=Verdana]sql server 2000[/font][font=宋体]下收到如下错误:[/font][/p][p=30, 2, left][color=red][font=宋体]该操作未能执行,因为[/font][/color][color=red][font=Verdana] OLE DB [/font][/color][color=red][font=宋体]提供程序[/font][/color][color=red][font=Verdana] 'SQLOLEDB' [/font][/color][color=red][font=宋体]无法启动分布式事务。[/font][/color][/p][p=30, 2, left][color=red][font=Verdana][OLE/DB provider returned message: [/font][/color][color=red][font=宋体]新事务不能登记到指定的事务处理器中。[/font][/color][color=red][font=Verdana] ][/font][/color][/p][p=30, 2, left][color=red][font=Verdana]OLE DB [/font][/color][color=red][font=宋体]错误跟踪[[/font][/color][color=red][font=Verdana]OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a[/font][/color][color=red][font=宋体]]。[/font][/color][/p]
[font=Verdana][size=12pt]二、 [/size][/font][font=宋体][size=12pt]解决方案[/size][/font][font=Verdana][size=10.5pt]1.
[/size][/font][font=宋体][size=10.5pt]双方启动[/size][/font][font=Verdana][size=10.5pt]MSDTC[/size][/font][font=宋体][size=10.5pt]服务[/size][/font][p=30, 2, left][font=Verdana]MSDTC[/font][font=宋体]服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动[/font][font=Verdana]MSDTC[/font][font=宋体]([/font][font=Verdana]Distributed Transaction Coordinator[/font][font=宋体])[/font][font=宋体]服务。[/font][/p][font=Verdana][size=10.5pt]2.
[/size][/font][font=宋体][size=10.5pt]打开双方[/size][/font][font=Verdana][size=10.5pt]135[/size][/font][font=宋体][size=10.5pt]端口[/size][/font][p=30, 2, left][font=Verdana]MSDTC[/font][font=宋体]服务依赖于[/font][font=Verdana]RPC[/font][font=宋体]([/font][font=Verdana]Remote Procedure Call (RPC)[/font][font=宋体])服务[/font][font=Verdana],RPC[/font][font=宋体]使用[/font][font=Verdana]135[/font][font=宋体]端口,保证[/font][font=Verdana]RPC[/font][font=宋体]服务启动,如果服务器有防火墙,保证[/font][font=Verdana]135[/font][font=宋体]端口不被防火墙挡住。[/font]
[/p][p=30, 2, left]
[font=宋体]使用“[/font][font=Verdana]telnet IP 135 [font=宋体]”[/font][font=宋体]命令测试对方端口是否对外开放。也可用端口扫描软件(比如[/font]Advanced Port Scanner[/font][font=宋体])扫描端口以判断端口是否开放。[/font][/p][font=Verdana][size=10.5pt]3.
[/size][/font][font=宋体][size=10.5pt]保证链接服务器中语句没有访问发起事务服务器的操作[/size][/font][p=30, 2, left][font=宋体]在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务服务器的操作,这样的操作叫做环回([/font][font=Verdana]loopback[/font][font=宋体]),是不被支持的,所以要保证在链接服务器中不存在此类操作。[/font][/p][font=Verdana][size=10.5pt]4.
[/size][/font][font=宋体][size=10.5pt]在事务开始前加入[/size][/font][font=Verdana][size=10.5pt]set xact_abort ON[/size][/font][font=宋体][size=10.5pt]语句[/size][/font][p=30, 2, left][font=宋体]对于大多数[/font][font=Verdana] OLE DB [/font][font=宋体]提供程序(包括[/font][font=Verdana] SQL Server[/font][font=宋体]),必须将隐式或显示事务中的数据修改语句中的[/font][font=Verdana]XACT_ABORT [/font][font=宋体]设置为[/font][font=Verdana] ON[/font][font=宋体]。唯一不需要该选项的情况是在提供程序支持嵌套事务时。[/font][/p][font=Verdana][size=10.5pt]5.
[/size][/font][font=Verdana][size=10.5pt]MSDTC[/size][/font][font=宋体][size=10.5pt]设置[/size][/font][p=30, 2, left][font=宋体]打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键。在[/font][font=Verdana]MSDTC[/font][font=宋体]选项卡中,点击“安全配置”按钮。[/font][/p][p=30, 2, left][font=宋体]在安全配置窗口中做如下设置:[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]选中“网络[/font][font=Verdana]DTC[/font][font=宋体]访问”[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]在客户端管理中选中“允许远程客户端”“允许远程管理”[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]保证[/font][font=Verdana]DTC[/font][font=宋体]登陆账户为:[/font][font=Verdana]NT   Authority\NetworkService
[img=435,394]http://images.cnblogs.com/cnblogs_com/chnking/DTC/dtc.JPG[/img]
[/font][/p][p=30, 2, left]
[/p][font=Verdana][size=10.5pt]6.
[/size][/font][font=宋体][size=10.5pt]链接服务器和名称解析问题[/size][/font][p=30, 2, left][font=宋体]建立链接[/font][font=Verdana]sql server[/font][font=宋体]服务器,通常有两种情况[/font][font=Verdana]:[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]第一种情况,产品选[/font][font=Verdana]”sql server”[/font][/p][p=30, 2, left][font=Verdana]EXEC sp_addlinkedserver[/font][/p][p=30, 2, left][font=Verdana]   @server='linkServerName',[/font][/p][p=30, 2, left][font=Verdana]   @srvproduct = N'SQL Server'[/font][/p][p=30, 2, left][font=宋体]这种情况,[/font][font=Verdana]@server [/font][font=宋体]([/font][font=Verdana]linkServerName[/font][font=宋体])就是要链接的[/font][font=Verdana]sqlserver[/font][font=宋体]服务器名或者[/font][font=Verdana]ip[/font][font=宋体]地址。[/font][/p][p=30, 2, left][font=Wingdings]l
[/font][font=宋体]第二种情况,访问接口选[/font][font=Verdana]“Microsoft OLE DB Provider Sql Server”[/font][font=宋体]或[/font][font=Verdana]“Sql Native Client”[/font][/p][p=30, 2, left][font=Verdana]EXEC sp_addlinkedserver  [/font][/p][p=30, 2, left][font=Verdana]   @server=' linkServerName ',[/font][/p][p=30, 2, left][font=Verdana]   @srvproduct='',[/font][/p][p=30, 2, left][font=Verdana]   @provider='SQLNCLI',[/font][/p][p=30, 2, left][font=Verdana]   @datasrc='sqlServerName'[/font][/p][p=30, 2, left][font=宋体]这种情况,[/font][font=Verdana]@datasrc[/font][font=宋体]([/font][font=Verdana]sqlServerName[/font][font=宋体])就是要链接的实际[/font][font=Verdana]sqlserver[/font][font=宋体]服务器名或者[/font][font=Verdana]ip[/font][font=宋体]地址。[/font][/p]
[p=30, 2, left][font=Verdana]Sql server[/font][font=宋体]数据库引擎是通过上面设置的服务器名或者[/font][font=Verdana]ip[/font][font=宋体]地址访问链接服务器,[/font][font=Verdana]DTC[/font][font=宋体]服务只通过服务器名[/font][font=宋体]地址访问链接服务器,所以要保证数据库引擎和[/font][font=Verdana]DTC[/font][font=宋体]都能通过服务器名或者[/font][font=Verdana]ip[/font][font=宋体]地址访问到链接服务器。[/font][/p][p=30, 2, left][font=宋体]数据库引擎和[/font][font=Verdana]DTC[/font][font=宋体]解析服务器的方式不太一样,下面分别叙述[/font][/p][font=Verdana][size=10.5pt]6.1
[/size][/font][font=宋体][size=10.5pt]数据库引擎[/size][/font][p=30, 2, left][font=宋体]第一种情况的[/font][font=Verdana]@server[/font][font=宋体]或者第二种情况的[/font][font=Verdana]@datasrc[/font][font=宋体]设置为[/font][font=Verdana]ip[/font][font=宋体]地址时,数据库引擎会根据[/font][font=Verdana]ip[/font][font=宋体]地址访问链接服务器,这时不需要做名称解析。[/font][/p][p=30, 2, left][font=宋体]第一种情况的[/font][font=Verdana]@server[/font][font=宋体]或者第二种情况的[/font][font=Verdana]@datasrc[/font][font=宋体]设置为[/font][font=Verdana]sql server[/font][font=宋体]服务器名时,需要做名称解析,就是把服务器名解析为[/font][font=Verdana]ip[/font][font=宋体]地址。[/font][/p][p=30, 2, left][font=宋体]有两个办法解析服务器名:[/font][/p][p=30, 2, left][font=宋体]一是在[/font][font=Verdana]sql server[/font][font=宋体]客户端配置中设置一个别名,将上面的服务器名对应到链接服务器的[/font][font=Verdana]ip[/font][font=宋体]地址。[/font][/p][p=30, 2, left][font=宋体]二是在“[/font][font=Verdana]C:\WINDOWS\system32\drivers\etc\hosts[/font][font=宋体]”文件中增加一条记录:[/font][/p][p=30, 2, left][font=Verdana]xxx.xxx.xxx.xxx   [/font][font=宋体]服务器名[/font][/p][p=30, 2, left][font=宋体]作用同样是把服务器名对应到链接服务器的[/font][font=Verdana]ip[/font][font=宋体]地址。[/font][/p][font=Verdana][size=10.5pt]6.2
[/size][/font][font=Verdana][size=10.5pt]DTC[/size][/font][p=30, 2, left][font=宋体]不管哪一种情况,只要[/font][font=Verdana]@server[/font][font=宋体]设置的是服务器名而不是[/font][font=Verdana]ip[/font][font=宋体]地址,就需要进行名称解析,办法同上面第二种办法,在[/font][font=Verdana]hosts[/font][font=宋体]文件中增加解析记录,上面的第一种办法对[/font][font=Verdana]DTC[/font][font=宋体]不起作用。[/font][/p][p=30, 2, left][font=宋体]如果[/font][font=Verdana]@server[/font][font=宋体]设置的是[/font][font=Verdana]ip[/font][font=宋体]地址,同样不需要做域名解析工作。[/font][/p][p=30, 2, left]
[/p][font=Verdana][size=10.5pt]7.
[/size][/font][font=宋体][size=10.5pt]远程服务器上的名称解析[/size][/font][p=30, 2, left][font=宋体]分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机器名或[/font][font=Verdana]ip[/font][font=宋体]查找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发起服务器。[/font][/p][p=30, 2, left][font=宋体]一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的解析,所以比较保险的做法是:[/font][/p][p=30, 2, left][font=宋体]在远程服务器的在“[/font][font=Verdana]C:\WINDOWS\system32\drivers\etc\hosts[/font][font=宋体]”文件中增加一条记录:[/font][/p][p=30, 2, left][font=Verdana]xxx.xxx.xxx.xxx   [/font][font=宋体]发起服务器名[/font][/p]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.