【问题标题】:Unable to begin a distributed transaction无法开始分布式事务
【发布时间】:2011-11-20 08:54:59
【问题描述】:

我正在尝试对链接服务器运行 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

如何让 Microsoft 偏爱功能而不是安全?

或者,至少,我怎样才能让两个 SQL 服务器相互通信?

相关问题


已经做了什么无关紧要,但我还是会发布它。

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

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

  3. 打开链接服务器上的随机选项:

  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
    

    在两台服务器上。

【问题讨论】:

  • 很高兴您没有跳过关键的“诅咒和发誓”步骤!
  • @joelarson 嘿,有时人们对您遵循每一个步骤非常挑剔。我不想让任何人说我没有尝试过。
  • 我喜欢这篇文章。它代表了我使用 MSDTC 的所有经历。
  • 就我而言,在链接服务器上将“启用 RPC 的分布式事务提升”设置为 False 后,它可以工作。也许试试
  • @HaiPhan 关闭分布式事务的使用会破坏跨国完整性:如果您在本地服务器上回滚更改,则意味着更改将保留在远程服务器上。非常危险。

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


【解决方案1】:

好的,因此服务已启动,它们之间存在以太网路径,名称解析有效,链接服务器有效,并且您禁用了事务身份验证。

我的直觉说是防火墙问题,但我想到了一些事情......

  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】:

    找到了,远程服务器上的 MSDTC 是本地服务器的克隆。

    来自 Windows 应用程序事件日志:

    事件类型:错误
    事件来源:MSDTC
    活动类别:CM
    事件 ID:4101
    日期:2011 年 9 月 19 日
    时间:下午 1:32:59
    用户:不适用
    计算机:ASITESTSERVER
    说明:

    本地 MS DTC 检测到 ASICMSTEST 上的 MS DTC 与本地 MS 具有相同的唯一标识 故障诊断码。这意味着两个 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- msdtc -uninstall 2- msdtc -install 3- 重新启动 SQL Server 服务 4- 重新启动 SQL 代理服务,以确保 5- 甚至重新启动“分布式事务协调器”服务...我已经在两台机器(主服务器和链接服务器)上完成了所有这些操作,但什么也没做,仍然是同样的错误!
    【解决方案3】:

    我上次使用 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,并且“PING DEVSQL”从远程 QA 服务器工作,这个问题就为我们解决了。

    我希望这会有所帮助!

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            我能够通过禁用“为 RPC 启用分布式事务的提升”(即将其设置为 False)来解决此问题(正如 cmets 中的其他人所提到的):

            根据@WonderWorker 的要求,您可以通过 SQL 脚本执行此操作:

            EXEC master.dbo.sp_serveroption
                 @server = N'[mylinkedserver]',
                 @optname = N'remote proc transaction promotion',
                 @optvalue = N'false'
            

            【讨论】:

            • 这对我有用。奇怪的是,它已经好几个星期了,然后突然开始了。可能是因为远程服务器的 DTC 服务可能被禁用。无论如何,谢谢。
            • 太棒了。您知道编写脚本的方法吗?在我所有的服务器上,所有链接的服务器对象都将分布式事务的启用提升设置为 true,我还无法弄清楚是谁做的。经历太乏味了。
            • @WonderWorker 我刚刚添加了一个您可以使用的示例 SQL 脚本,试一试!
            【解决方案8】:

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

            允许分布式事务协调器、勾选域、私有和公共选项

            【讨论】:

              【解决方案9】:

              对我来说,它与防火墙设置有关。转到您的防火墙设置,允许 DTC 服务,它工作。

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-01-27
                  • 1970-01-01
                  • 2013-04-21
                  • 2013-09-10
                  • 2015-07-02
                  • 1970-01-01
                  • 2017-01-18
                  • 2017-09-19
                  相关资源
                  最近更新 更多