无法开始分布式交易


95

我正在尝试对链接的服务器运行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 Server相互通信?

相关问题


已经做是无关紧要的,但无论如何,我会张贴。

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

    在此处输入图片说明

    在此处输入图片说明

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

    在此处输入图片说明

    在此处输入图片说明

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

在此处输入图片说明

  1. 被诅咒和发誓。

  2. 砸东西。

  3. 检查一个SELECT可以使用链接服务器

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. 检查客户端服务器是否可以ping远程服务器

         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. 检查@@SERVERNAME两个服务器上的服务器名称是否匹配

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

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

  8. 发行SET XACT_ABORT ON发行我的查询之前

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

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    在两个服务器上。


30
很高兴看到您没有跳过关键的“诅咒和誓言”步骤!
jwl

11
@joelarson嘿,有时候人们很特别,您会遵循每个步骤。我不想有人说我没有尝试。
伊恩·博伊德

5
我喜欢这个帖子。它代表了我曾经使用MSDTC的每一次经历。
A. Murray's

5
就我而言,在链接服务器上将“启用RPC的分布式事务的提升”设置为False后,它就可以工作。也许尝试一下
Sarsaparilla

3
@HaiPhan关闭分布式事务的使用会破坏跨国的完整性:如果在本地服务器上回滚更改,则意味着更改将保留在远程服务器上。非常危险。
伊恩·博伊德

Answers:


31

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

从Windows应用程序事件日志中:

事件类型:错误
事件源:MSDTC
事件类别:CM
事件ID:4101
日期
:9/19/2011时间:1:32:59 PM
用户: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服务即可对其进行修复。


2
让我们看看我是否做对了:1- msdtc-卸载2- msdtc-安装3-重新启动SQL Server服务4-重新启动SQL Agent服务,只是要确保5-甚至重新启动“分布式事务处理协调器”服务...我已经在两台机器(主服务器和链接服务器)上完成了所有这些操作,但是什么都没有,仍然是相同的错误!
Hamid Sadeghian

9

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

在此处输入图片说明


1
这对我有用。奇怪的是,已经好几个星期了,然后突然开始。可能是因为远程服务器的DTC服务可能已禁用。无论如何,谢谢。
Boyd P

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 Service以哪个帐户运行?

2

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


1

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

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


1

对我来说,它与防火墙设置有关。转到您的防火墙设置,允许DTC服务并且它起作用了。在此处输入图片说明


0

我最近一次使用MSDTC的经历和今天的错误原来是DNS问题。您在正确的位置上询问机器是否在同一域EBarr中。顺便说一句,这个问题的好清单!

我的情况:我需要子域中的服务器能够通过防火墙针对父域中的服务器运行分布式事务。多年来,我已经使用链接服务器很多次,所以我在Ian上面很好地记录了链接服务器的SQL和MSDTC中的所有常规设置。我为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服务器开始工作,此问题就为我们解决了。

我希望这有帮助!



0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.