在windows2003下执行分布式事务的时候出现如下情况。

一、 问题现象
在执行分布式事务时,在sql server 2005下收到如下错误:

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

消息 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]。

二、 解决方案-------使用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拒绝访问问题是win7、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

没有活动事务 链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务的更多相关文章

  1. 无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务

    在存储过程中使用事务,并且使用链接服务器时,报类似下面的错误 链接服务器"****"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 " ...

  2. 21. 无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务”

    无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务” 原因:调用存储过程的方式有问题,必须用JDBC方式调用存储过程才可以正常 ...

  3. 因为链接服务器 "SQLEHR" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务

    1.运行 regedt32,浏览至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC. 添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 ...

  4. 链接服务器XXX的OLE DB提供程序“SQLNCLI”无法启动分布式事务“

    错误消息msg 7391 16级状态1行1表示 “Msg 7391,Level 16,State 2,Line 1 无法执行该操作,因为链接服务器XXX的OLE DB提供程序“SQLNCLI”无法启动 ...

  5. 无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。

    无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务.由于 XACT_ABORT 选项已设置为 OFF,因 ...

  6. 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."

    开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...

  7. 链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。[手稿]

    消息 7302,级别 16,状态 1,第 1 行 无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.JET.OLEDB.4.0&qu ...

  8. 关于:无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    本人接触和使用Oracle数据库才有一个季度的时间,问题比较白,大神请无视本文. 环境: 1.数据服务器,windows2008R2,Oracle11g 2.报表服务器,windows2008R2,S ...

  9. 链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI11" 指示该对象没有列,或当前用户没有访问该对象的权限。

    原文:链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI11" 指示该对象没有列,或当前用户没有访问该对象的权限. SELECT * F ...

随机推荐

  1. JS获取屏幕高度(转)

    IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...

  2. 我常用的VS技巧

    声明:开发工具使用的是VS2013 1.开发 包括编辑,代码补全等 1.1快速选择一行 第一种方式:鼠标停留在要选择的行上,三击. 第二种方式:鼠标停留在要选择的行上,按home键将鼠标停留在行首,按 ...

  3. Centos6.5入侵清理

    今天早上来,网站打不开.通过xshell打不开终端,很久才打开.发现内存占用率高达95%,loadavg 15  16  16 现状: 负载太高     15        15            ...

  4. 即使用ADO.NET,也要轻量级动态生成更新SQL,比Ormlite性能更高

    先上测试结果: //测试1000次针对同一个表同一个字段更新,比Ormlite平均快2.34倍 //生成SQL+ExecuteNonQuery Ormlite 倍数 //6513ms 15158ms ...

  5. SpringBean_获取Spring加载的所有bean(实践)

      一.查询代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  6. 开发haproxy管理平台

    1.说明:该脚本仅适用于Linux操作系统2.使用方法: 在该脚本同级目录下要创建一个名字叫做 haproxy 的文件 haproxy 文件内容如下 global log 127.0.0.1 loca ...

  7. jeecg小吐槽续——自己折腾修改在线开发功能中“默认值”的使用

    -- 原来设置了"默认值"的字段,新建表单时不会出现在表单上,要保存后才能在列表页面出现,而且第二次编辑时,设置了"默认值"的字段再也不能改成空值! -- 要修 ...

  8. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  9. 正确遍历ElasticSearch索引

    1:ElasticSearch的查询过程 2:由ES查询模式引起的深度分页问题 3:如何正确遍历索引中的数据 ElasticSearch的查询过程 es的数据查询分两步: 第一步是的结果是获取满足查询 ...

  10. socket编程基础

    socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...