在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拒绝访问】的解决方法:
---转自http://blog.csdn.net/xvhaijun/article/details/4505461