没有活动事务 连接服务器的 OLE DB 访问接口 "SQLNCLI" 没法启动分布式事务

在windows2003下执行分布式事务的时候出现以下状况。sql

1、 问题现象
在执行分布式事务时,在sql server 2005下收到以下错误:数据库

连接服务器"xxxxxxx"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。windows

消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行浏览器

没法执行该操做,由于连接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 没法启动分布式事务。安全

在sql server 2000下收到以下错误:服务器

该操做未能执行,由于 OLE DB 提供程序 'SQLOLEDB' 没法启动分布式事务。网络

[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]分布式

OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。ide

2、 解决方案-------使用DCTPing工具检测
1.        双方启动MSDTC服务--DTC、RPC服务
MSDTC服务提供分布式事务服务,若是要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。工具

2.        打开双方135端口(或关闭防火墙
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,若是服务器有防火墙,保证135端口不被防火墙挡住。  

使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(好比Advanced Port Scanner)扫描端口以判断端口是否开放。

3.        保证连接服务器中语句没有访问发起事务服务器的操做
在发起事务的服务器执行连接服务器上的查询、视图或存储过程当中含有访问发起事务服务器的操做,这样的操做叫作环回(loopback),是不被支持的,因此要保证在连接服务器中不存在此类操做。

4.        在事务开始前加入set xact_abort ON语句
对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。惟一不须要该选项的状况是在提供程序支持嵌套事务时。

5.        MSDTC设置
打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“个人电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。

在安全配置窗口中作以下设置:

l选中“网络DTC访问”

l在客户端管理中选中“容许远程客户端”“容许远程管理”

l在事务管理通信中选“容许入站”“容许出站”“不要求进行验证”

l保证DTC登录帐户为:NT   Authority\NetworkService

6.        连接服务器和名称解析问题
创建连接sql server服务器,一般有两种状况:

l第一种状况,产品选”sql server”

EXEC sp_addlinkedserver

   @server='linkServerName',

   @srvproduct = N'SQL Server'

这种状况,@server (linkServerName)就是要连接的sqlserver服务器名或者ip地址。

l第二种状况,访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”

EXEC sp_addlinkedserver  

   @server=' linkServerName ',

   @srvproduct='',

   @provider='SQLNCLI',

   @datasrc='sqlServerName'

这种状况,@datasrc(sqlServerName)就是要连接的实际sqlserver服务器名或者ip地址。

Sql server数据库引擎是经过上面设置的服务器名或者ip地址访问连接服务器,DTC服务也是经过服务器名或者ip地址访问连接服务器,因此要保证数据库引擎和DTC都能经过服务器名或者ip地址访问到连接服务器。

数据库引擎和DTC解析服务器的方式不太同样,下面分别叙述

6.1       数据库引擎
第一种状况的@server或者第二种状况的@datasrc设置为ip地址时,数据库引擎会根据ip地址访问连接服务器,这时不须要作名称解析。

第一种状况的@server或者第二种状况的@datasrc设置为sql server服务器名时,须要作名称解析,就是把服务器名解析为ip地址。

有两个办法解析服务器名:

一是在sql server客户端配置中设置一个别名,将上面的服务器名对应到连接服务器的ip地址。

二是在“C:\WINDOWS\system32\drivers\etc\hosts”文件中增长一条记录:

xxx.xxx.xxx.xxx   服务器名

做用一样是把服务器名对应到连接服务器的ip地址。

6.2       DTC
无论哪种状况,只要@server设置的是服务器名而不是ip地址,就须要进行名称解析,办法同上面第二种办法,在hosts文件中增长解析记录,上面的第一种办法对DTC不起做用。

若是@server设置的是ip地址,一样不须要作域名解析工做。

=======================================================================

以上是我从网上转的,其实在设置MSDTC安全那部分,容许远程客户端这个能够不勾选,但最重要的是下面那一步,在事务管理通信中选“容许入站”“容许出站”“不要求进行验证”,在windows2003中默认的是选的第一项要求对双方进行验证,我遇到的状况,把这个改过来就不会再报错了。另外下面的那个登陆用户只能用那个network service,用别的在sqlserver里就会说msdtc不可用。

=======================================================================

++++++++++++++++++++++++【如下为我的内容】++++++++++++++++++++++++++++++++++++

=======================================================================

文章转自网络,http://sai5d.blog.163.com/blog/static/62225483200901322939411/ 以上颜色标注的文字为须要注意的地方,其余的通常默认就OK,整体来讲配置不一样服务器间的触发器MSDTC须要注意三个方面,上面server2003是一个,下面还有两个:host解析、msdtc拒绝访问-------这些都先用采用DTCPing工具测试连通性

备注:hosts解析不能即时生效的问题和文章标题这个问题通常都是出如今server2003上,在server2008上就不多见了,但msdtc拒绝访问问题是win七、server2008上常见。

  另外附windows server 2003 【hosts文件更改后,不生效】的解决办法:

  打开本地链接的 Internet(TCP/IP)协议的属性页,点击常规选项卡中的高级按钮,选择WINS选项卡,勾选“启用 LMHOSTS 查询”,接着按下“导入 LMHOSTS”按钮,导入C:/WINDOWS/system32/drivers/etc下的hosts文件,这样再次启动浏览器时,就会发现网站都 被屏蔽了,hosts文件生效了。

  --转自http://blog.csdn.net/jaycxing/article/details/5286150

  【MSDTC拒绝访问】的解决方法:

  1. 单击“开始”,单击“运行”,键入“gpedit.msc”,而后单击“肯定”,打开组策略。
  2. 打开组策略后,选择“计算机配置->管理模板->系统->远过程调用->用于未验证的RPC客户端的限制”。
  3. 双击“用于未验证的RPC客户端的限制”,在弹出的右键菜单里选择“属性”。
  4. 在弹出的“属性”对话框里选择“设置”属性页,选择“已启用”、“要应用的RPC运行时未验证的客户端限制”选择“无”。
  5. 单击“肯定”完成设置。

   ---转自http://blog.csdn.net/xvhaijun/article/details/4505461

相关文章
相关标签/搜索