分布式事务,我的情况是两台win2003+sql2005的服务器,在事务中使用链接服务器,提示:“'SQLOLEDB' 无法启动分布式事务”按照zjcxc(邹建)的解决方案做了(http://topic.csdn.net/t/20040608/12/3073266.html):一.不使用事务用select分布式查询,没有问题
   使用事务用select分布式查询,也没有问题
   使用事务用insert往链接服务器中插入记录,就出现“'SQLOLEDB' 无法启动分布式事务”错误。二.两台机的MSDTC是否都打开了. --错误依然
三.两台MSDTC都按照上述说明就行设置了。--错误依然
四.两台服务器都启动着RPC服务,135端口也都开着。--错误依然
五.把连接服务器改成MSDASQL方式的连接。--错误依然
七.两台服务器不在同一个域,在msdtc的安全设置中都设置了“不需要进行验证”。--错误依然后面的几项,因为我是win2003+sql2005,系统够更新的。最后,--错误还是依然。我晕。

解决方案 »

  1.   


    EXEC sp_configure 'show advanced option', '1';EXEC sp_configure 'Ad Hoc Distributed Queries','1'
    RECONFIGURE WITH OVERRIDE;
      

  2.   

    参考:
    windows 2003+Sql2000中OLEDB分布式事务无法启动的解决方案
    --------------------------------------------------------在开发分布式数据库软件时,经常碰到下面的错误:
    服务器: 消息 7391,级别 16,状态 1,行 6
    该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分
    布式事务。
    [OLE/DB provider returned message: 不能在指定的事务处理器中
    获得新事务。]
    -----------------------------------------
    服务器: 消息 8520,级别 20,状态 1,行 8
    内部 MSDTC 事务的提交失败: Result Code = 0x8004d019。连接中断
    -----------------------------------------
    搜索了网上类似问题的解决方案,都建议采用下面的方法
    (方法一):
    1、运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC。
    添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 1。
    2、重启MS DTC服务。
    3、打开“管理工具”的“组件服务”。
      a. 浏览至"启动管理工具"。    b. 选择"组件服务"。    c. 展开"组件服务"树,然后展开"我的电脑"。    
      d. 右键单击"我的电脑",然后选择"属性"。     
      在 MSDTC 选项卡中,确保选中了下列选项:网络 DTC 访问 网络管理 网络事务XA 事务
      另外,"DTC 登录帐户"一定要设置为"NT Authority\NetworkService"。
    4、重启MS DTC服务。
    5、再次运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC,然后删除 TurnOffRpcSecurity 项。但是实际上该方法基本上解决不了问题,经过长时间的反复实践,我终于按下面的方法解决了:
    (方法二)
    1、按照方法一的方法处理一遍,如果不行,再继续下面的方法
    2、安装windows 2003 sp1,安装好后,方法一中的第4步设置对话框和原来不一样了,选择“事务管理通讯”中的“不要求验证”
    3、最好安装好MDAC2.8
    3、通过查找,在C:找到名为“hosts”的文件(没有扩展名),通常路径为C:\WINDOWS\system32\drivers\etc,将对方服务器的IP和计算机对应起来,参考如下:
    ========================================
    # Copyright (c) 1993-1999 Microsoft Corp.
    #
    # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    # www.knowsky.com
    # This file contains the mappings of IP addresses to host names. Each
    # entry should be kept on an individual line. The IP address should
    # be placed in the first column followed by the corresponding host name.
    # The IP address and the host name should be separated by at least one
    # space.
    #
    # Additionally, comments (such as these) may be inserted on individual
    # lines or following the machine name denoted by a '#' symbol.
    #
    # For example:
    #
    #      102.54.94.97     rhino.acme.com          # source server
    #       38.25.63.10     x.acme.com              # x client host127.0.0.1 localhost
    192.168.1.2 中心
    192.168.1.3 西站
    192.168.106.35 信息中心2
    =============================================
    一定要将每台服务器的hosts文件都修改好
      

  3.   

    有没有朋友用sql server做分布式事务做成功的啊?
      

  4.   

    不用事务能成功吗?
    比如直接:
    select * from test.master..sysobjects
      

  5.   

    不用事务都可以成功,包括update
      

  6.   

    sqlserver2000我成功过,也失败过,但没找出原因 :(
      

  7.   

    同意 gc_ding(施主,给个妞泡好么) 本地事务和远程事务操作之间的鸿沟就是tcpip和netbios之间的联系就是改host后,并在执行事务的登陆帐号上用远程sqlserver的实例名连接,实例名最好和机器名一样
      

  8.   

    fordfamily(c#阁下) 能不能说的详细些?你是说使用即席访问还是使用链接服务器?
      

  9.   

    如果读远程数据那么不会错,写就不行了
    那么执行
    set ansi_nulls on goset ansi_warnings oninsert into server_Pqs.dbname_Pqs.dbo.tablename values( .......)就可以了
      

  10.   

    本地访问是没有任何问题的,
    远程访问时,注意几个问题:
    命名管道是否开通;
    sqlserver实例名是否在hosts里设定过;
    机器名和实例名是否一致(此项在机器名作改动后,即使hosts文件设置好了也有可能会影响访问)
      

  11.   

    总结:http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html