无法开始分布式事务

时间:2011-09-19 15:40:09

标签: sql-server sql-server-2005 msdtc distributed-transactions

我正在尝试针对链接服务器运行SQL,但我得到错误。

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions


OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

提供商返回了两个错误:

错误#1:

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

错误#2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

我如何让微软支持功能而非安全性?

或者,至少,我如何让两个SQL Severs相互通信?

相关问题


所做的无关紧要,但无论如何我都会发布。

  1. 确保两个机器上都运行Distributed Transaction Coordinator服务:

    enter image description here

    enter image description here

  2. 禁用两台计算机上的所有MSDTC安全性:

    enter image description here

    enter image description here

  3. 启用链接服务器上的随机选项:

  4. enter image description here

    1. 诅咒和发誓。

    2. 捣乱的事情。

    3. 检查SELECT是否可以使用链接服务器

         SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
         ....
      
         (763 row(s) affected)
      
    4. Checked that client server can ping the remote server

          C:\Documents and Settings\avatar>ping asicmstest.contoso.com
      
          Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
      
          Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
      
          Ping statistics for 10.0.0.40:
              Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
          Approximate round trip times in milli-seconds:
              Minimum = 0ms, Maximum = 0ms, Average = 0ms
      
    5. 检查远程服务器是否可以按名称返回到发起服务器:

          C:\Documents and Settings\avatar>ping asitestserver.contoso.com
      
          Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
      
          Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
          Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
      
          Ping statistics for 10.0.0.22:
              Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
          Approximate round trip times in milli-seconds:
              Minimum = 0ms, Maximum = 0ms, Average = 0ms
      
    6. Checked that @@SERVERNAME matches the server name on both servers

        SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
      
        -------------  -------------
        ASITESTSERVER  ASITESTSERVER
      

        SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
      
        ----------  ----------
        ASIGROBTEST  ASIGROBTEST
      
    7. 尖叫

    8. Issued SET XACT_ABORT ON before issuing my query

      SET XACT_ABORT ON
      GO
      BEGIN DISTRIBUTED TRANSACTION
      SELECT TOP 1 * FROM Sessions
      
    9. Granted Everyone Full Control to

      HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
      
      两台服务器上的

10 个答案:

答案 0 :(得分:28)

发现它,远程服务器上的MSDTC是本地服务器的克隆。

从Windows应用程序事件日志:

  

事件类型:错误
  活动来源:MSDTC
  活动类别:CM
  事件ID:4101
  日期:2011年9月19日
  时间:下午1:32:59
  用户:N / A
  电脑:ASITESTSERVER
  说明:

     

本地MS DTC检测到了这一点   ASICMSTEST上的MS DTC与本地MS具有相同的唯一标识   DTC。这意味着两个MS DTC将无法通信   彼此。如果其中一个系统通常会出现此问题   使用不受支持的克隆工具克隆。 MS DTC要求   使用支持的克隆工具(如SYSPREP)克隆系统。   从命令运行'msdtc -uninstall'然后'msdtc -install'   提示将解决问题。注意:运行'msdtc -uninstall'会   导致系统丢失所有MS DTC配置信息。

     

有关详细信息,请参阅位于的“帮助和支持中心”   http://go.microsoft.com/fwlink/events.asp

运行

msdtc -uninstall
msdtc -install

然后停止并重新启动SQL Server服务修复它。

答案 1 :(得分:6)

好的,所以服务启动,它们之间有一个以太网路径,名称解析工作,链接服务器工作,你禁用了事务身份验证。

我的直觉说防火墙问题,但有些事情会浮现在脑海中......

  1. 机器是否在同一个域中? (是的,与禁用身份验证无关)
  2. 防火墙是否在机器上运行? DTC对于防火墙来说可能有点痛苦,因为它使用一系列端口,请参阅http://support.microsoft.com/kb/306843目前,我会为了识别问题而禁用防火墙
  3. DTC ping说什么? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. 运行的SQL服务是什么帐户?

答案 2 :(得分:5)

通过禁用“为RPC启用分布式事务的启用”,我能够解决此问题(如评论中提到的其他问题):

enter image description here

答案 3 :(得分:2)

如果服务器是群集的并且存在群集DTC,则必须禁用群集DTC上的安全性而不是本地DTC上的安全性。

答案 4 :(得分:1)

如果目标服务器位于其他云或数据中心,则需要在源服务器中添加 MSDTC服务(目标服务器)的主机条目。

如果问题未解决,请尝试此操作,启用MSDTC设置后。

答案 5 :(得分:1)

对我来说,它与防火墙设置有关。转到您的防火墙设置,允许DTC服务并且它起作用。enter image description here

答案 6 :(得分:0)

我与MSDTC的最后一次冒险,今天的错误结果证明是DNS问题。你正确地询问机器是否在同一个域,EBarr。顺便说一句,这个问题很棒!

我的情况:我需要子域中的服务器才能通过防火墙对父域中的服务器运行分布式事务。多年来我一直使用链接服务器,因此我在SQL中为链接服务器和MSDTC中的所有常用设置提供了Ian在上面很好地记录的内容。我设置了MSDTC,其中包含一系列TCP端口(5000-5200),可在两台服务器上使用,并在端口1433和5000-5200的盒子之间安排防火墙。这应该有效。链接服务器测试正常,我可以很好地通过链接服务器查询远程SQL服务器,但我不能让它允许分布式事务。我甚至可以从DEV服务器上看到QA服务器上的连接,但是有些东西没有回来。

我可以使用FQDN从QA PING DEV服务器,例如:PING DEVSQL.dev.domain.com

我无法使用机器名PING DEV服务器:PING DEVSQL

DEVSQL服务器原本应该是两个域的成员,但名称并没有在父域的DNS中解析...父域中DEVSQL的机器帐户发生了某些事情。一旦我们将DEVSQL添加到父域的DNS,并且&#34; PING DEVSQL&#34;从远程QA服务器工作,这个问题已经解决了。

我希望这有帮助!

答案 7 :(得分:0)

除了安全设置之外,我还必须在两台服务器上打开一些端口才能运行事务。我不得不打开端口59640,但根据以下建议,端口135必须打开。 http://support.microsoft.com/kb/839279

答案 8 :(得分:0)

我遇到了同样的错误,我设法通过在源服务器上正确配置MSDTC来解决此问题,以允许出站并允许DTC通过Windows防火墙。

允许分布式事务处理协调器,刻度域,私人和公共选项

答案 9 :(得分:0)

允许 DTC 勾选私有和公共以及域的防火墙设置起到了作用。仅仅域是不够的(感觉应该是,但不)。