无法开始分布式事务

106
我试图对一个链接服务器运行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.

提供者返回了两个错误:
第一个错误:
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服务器之间进行通信?
相关问题。
我所做的是无关紧要的,但我会发帖。
  1. 确保两台计算机上运行Distributed Transaction Coordinator服务:

    enter image description here

    enter image description here

  2. 在两台计算机上禁用所有MSDTC安全选项:

    enter image description here

    enter image description here

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

enter image description here

  1. Cursed and swore.

  2. Smashed things.

  3. Checked that a SELECT can use the linked server:

        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. Checked that the remote server can commnicate back, by name, to the initiating server:

         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
    

    and

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

  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
    

    on both servers.


39
很高兴看到你没有跳过关键的“诅咒和咒骂”的步骤! - jwl
12
嗨,有时候人们会非常在意你是否遵循了每一个步骤。我不想让任何人说我没有尝试过某件事情。 - Ian Boyd
7
我喜欢这篇文章。它典型地体现了我与 MSDTC 的所有经历。 - A. Murray
5
在我的情况下,当我将链接服务器上的“启用RPC分布式事务促进”设置为False时,它起作用了。也许你可以尝试一下。 - Sarsaparilla
4
关闭分布式事务的使用会破坏跨节点事务的完整性:如果在本地服务器上回滚更改,意味着远程服务器上的更改将保持不变。非常危险。 - Ian Boyd
11个回答

33

找到原因了,远程服务器的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 配置信息。

有关更多信息,请参见帮助和支持中心

运行

msdtc -uninstall
msdtc -install

重启SQL Server服务后问题得到解决。


3
让我们看看我是否理解正确: 1- msdtc -uninstall 2- msdtc -install 3- 重新启动 SQL Server 服务 4- 为确保起见,重启SQL代理服务 5- 甚至重新启动“分布式事务协调器”服务...我已经在两台机器(主服务器和链接服务器)上执行了所有这些操作,但仍然无法解决相同的错误! - Hamid Sadeghian

22

正如其他评论中提到的那样,我成功解决了这个问题,方法是禁用“启用 RPC 的分布式事务推广”(即将其设置为False):

输入图像说明

按照 @WonderWorker 的要求,你可以通过 SQL 脚本来执行此操作:

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

1
这对我有用。奇怪的是它已经运行了几周,然后突然开始出问题。可能是因为远程服务器的DTC服务被禁用了。无论如何,谢谢你。 - Boyd P
1
太棒了。你知道有没有一种脚本的方法吗?在我所有的服务器上,所有的链接服务器对象都已经将分布式事务启用提升设置为true,但我还没有找出是谁做的。这太繁琐了。 - WonderWorker
1
@WonderWorker,我刚刚添加了一个示例SQL脚本,你可以使用它,试一试! - Steve Bauman

7

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

我的直觉告诉我这是防火墙问题,但有几件事情需要考虑...

  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

对我来说,这与防火墙设置有关。前往您的防火墙设置,允许DTC服务,它就能正常工作。

enter image description here

2

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


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

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


1
我的最后一次与MSDTC的冒险,以及今天的这个错误,结果是一个DNS问题。EBarr,你问机器是否在同一个域上,你走在了正确的轨道上。顺便说一句,这个问题的列表很棒!
我的情况是:我需要在子域中的服务器能够通过防火墙对父域中的服务器运行分布式事务。多年来,我经常使用链接服务器,因此我在SQL中有所有通常的设置,以及Ian在上面很好地记录的MSDTC设置。我在两台服务器上都使用了一系列TCP端口(5000-5200)来设置MSDTC,并为端口1433和5000-5200之间的盒子安排了防火墙漏洞。那应该可以工作。链接服务器测试正常,我可以通过链接服务器很好地查询远程SQL服务器,但我无法让它允许分布式事务。我甚至可以从DEV服务器看到QA服务器上的连接,但某些东西没有回来。
我可以使用像PING DEVSQL.dev.domain.com这样的FQDN从QA中的DEV服务器PING DEV服务器。
我无法仅使用机器名称PING DEVSQL。

DEVSQL服务器应该是两个域的成员,但是在父域的DNS中无法解析名称... DEVSQL在父域的机器帐户出了问题。一旦我们将DEVSQL添加到父域的DNS中,并且从远程QA服务器“PING DEVSQL”可用,这个问题就得到了解决。

希望这可以帮助你!


0
我曾经遇到过同样的错误,通过在源服务器上正确配置 MSDTC 以允许出站并通过 Windows 防火墙允许 DTC,最终解决了这个问题。
请允许分布式事务协调器,并勾选域、私有和公共选项。

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

0

防火墙设置允许 DTC 的勾选私有、公共以及域名就解决了问题。只勾选域名是不够的(虽然感觉应该够了,但实际上不行)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接