none
sqlserver 2008 R2 分布式事务不能启用 RRS feed

  • 问题

  • sqlserver 版本:
    Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)   Apr  2 2010 15:53:02   Copyright (c) Microsoft Corporation  Express Edition with Advanced Services on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

    问题描述:两个数据库,系统和数据库环境都一样,我在A库中使用链接服务器(sp_addlinkedserver)将B库的数据查询过来然后插入到自己 的表中(insert into table select 链接服务器.库.dbo.table),整个过程是放在一个事务中执行的,我启用了msdtc ,SET XACT_ABORT设为ON,在1号机器和2号机器中能执行成功,但是在3号机器和4号机器之间却报错:

    链接服务器 "xxxxx" OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务”

    打断点,跟踪错误发现:查询链接服务器中的数据时正常,在更新链接服务器中的数据时报错

    把 1 2号机器脱域测试,能成功,说明跟域无关;

    再查文档,描述如下:

    “如果分布式查询是针对分布式分区视图的,或是在连接为显式事务或隐式事务时执行,则应用以下规则:

    • 对于不支持 ITransactionJoin 的访问接口,只允许执行读取操作。不支持任何事务或只支持 ITransactionLocal 的访问接口不能参与更新操作。

    • 如果 SET XACT_ABORT 设置为 ON,则对于支持 ITransactionJoin 的任何访问接口,允许执行所有的更新操作。数据库引擎的控制实例会自动调用参与更新操作的每台链接服务器中的 ITransactionJoin,以便在分布式事务中注册该服务器。然后当主控服务器指示提交事务或回滚事务时,Microsoft 分布式事务处理协调器 (MS DTC) 提交事务或回滚事务”

    请帮忙分析下原因在哪儿?


    • 已移动 Sheng Jiang 蒋晟 2012年4月27日 15:27 (发件人:一般性问题讨论区)
    • 已编辑 wacthamu 2012年5月2日 1:33
    2012年4月26日 7:58

全部回复

  • 无人知晓?!
    2012年5月2日 1:19
  • 检查一下系统的 MSDTC 配置有没有对, 在命令提示符中输入 dcomcnfg, 然后在左边的导航中展开组件服务--计算机机--我的电脑, >=win 2008的系统继续展开下面的Distributed Transactions--右键本地DTC, 之前的版本直接右键我的电脑, 在属性里面的安全项看看相关的配置有没有设置对

    另外一个就是检查MSDTC 需要的端口有没有被防火墙限制

    • 已建议为答案 Molly Bryant 2012年5月2日 3:25
    • 取消建议作为答案 wacthamu 2012年5月3日 3:51
    2012年5月2日 1:43
  • And ensure you enable network access in msdtc.
    2012年5月2日 1:47
  • 参考:http://www.cnblogs.com/nzperfect/archive/2011/11/03/2234595.html

    msdtc的错误,如果win msdtc是配置正确的,那么其它原因一般都是name和ip解析不对应,或者是防火墙问题。
    你可以ping hostname和ping -a ip来确定dns解析是否正确,并把防火墙都关闭。

    Best Regards, nicofer

    2012年5月2日 5:02
  • DTC配置已经配置好,我想问的是这个跟ITransactionJoin 又没有关系,是不是3 4号机器的OLEDB接口不支持ITransactionJoin ,因为报错发生在更新操作时,而读取链接服

    务器的数据并没有报错,我不知道怎么查询OLEDB接口是否支持ITransactionJoin

    我的系统是XP SP3,1 2号机器能成功,3 4 号机器确保错 这样的问题解决不了是绝对不能容忍的

    2012年5月3日 4:02
  • 检查一下系统的 MSDTC 配置有没有对, 在命令提示符中输入 dcomcnfg, 然后在左边的导航中展开组件服务--计算机机--我的电脑, >=win 2008的系统继续展开下面的Distributed Transactions--右键本地DTC, 之前的版本直接右键我的电脑, 在属性里面的安全项看看相关的配置有没有设置对

    另外一个就是检查MSDTC 需要的端口有没有被防火墙限制

    DTC配置已经配置好,我想问的是这个跟ITransactionJoin 又没有关系,是不是3 4号机器的OLEDB接口不支持ITransactionJoin ,因为报错发生在更新操作时,而读取链接服

    务器的数据并没有报错,我不知道怎么查询OLEDB接口是否支持ITransactionJoin

    我的系统是XP SP3,1 2号机器能成功,3 4 号机器确保错 这样的问题解决不了是绝对不能容忍的


    2012年5月3日 5:51
  • IS msdtc running on machine 3 & 4?
    2012年5月3日 14:56
  • IS msdtc running on machine 3 & 4?
    yes. I don't know how it is
    2012年5月7日 1:04
  • Double check if distributed transaction coordinator service is running on those machines.
    2012年5月7日 3:09