服务器上的 MSDTC 'server is unavailable'

MSDTC on server 'server is unavailable'

我在 SQL 服务器上收到这个奇怪的错误。而且我无法在旧帖子中找到解决方案。

我有这个程序:

create proc _upJM_SyncAll_test
as
begin
    DECLARE @SQLString nvarchar(max)

set @SQLString = N'
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setitemprices'') where acSubject not in (select acSubject from _uvJM_SetSubj)
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setsubj'') where acSubject not in (select acSubject from _uvJM_SetSubj)

update a
set acName2 = b.acName2,
    acName3 = b.acName3,
    acAddress = b.acAddress,
    acPost = b.acPost,
    acPostName = b.acPostName, 
    acCountry = b.acCountry, 
    acVATCodePrefix = b.acVATCodePrefix,
    acCode = b.acCode, 
    anDaysForPayment = b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where 1=1
and (   isnull(a.acName2,'''') <> isnull(b.acName2,'''') OR 
        isnull(a.acName3,'''') <> isnull(b.acName3,'''') OR 
        isnull(a.acAddress,'''') <> isnull(b.acAddress,'''') OR 
        isnull(a.acPost,'''') <> isnull(b.acPost,'''') OR 
        isnull(a.acPostName,'''') <> isnull(b.acPostName,'''') OR 
        isnull(a.acCountry,'''') <> isnull(b.acCountry,'''') OR 
        isnull(a.acVATCodePrefix,'''') <> isnull(b.acVATCodePrefix,'''') OR 
        isnull(a.acCode,'''') <> isnull(b.acCode,'''') OR 
        isnull(a.anDaysForPayment,'''') <> isnull(b.anDaysForPayment,'''')
)

insert into OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') (acSubject, acName2, acName3, acAddress, acPost, acPostName, acCountry, acVATCodePrefix, acCode, anDaysForPayment)
select b.acSubject, b.acName2, b.acName3, b.acAddress, b.acPost, b.acPostName, b.acCountry, b.acVATCodePrefix, b.acCode, b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a right join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where a.acSubject is null '

EXECUTE sp_executesql @SQLString;
end

当我在 management studio 中 运行 程序是这样的:

  exec dbo._upJM_SyncAll_test

一切正常。我没有收到任何错误,同步工作正常。

但是当我像这样在触发器中执行时:

create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
    exec dbo._upJM_SyncAll_test
end

我收到这个错误:

Msg 8501, Level 16, State 3, Procedure _upJM_SyncAll_test, Line 54
MSDTC on server 'server' is unavailable.

程序_upJM_SyncAll_test只有39行...

触发器包含在插入、更新和删除语句所需的隐式事务中。因为您在事务中连接到链接服务器,SQL服务器将其提升为分布式事务。

您需要配置 MSDTC,您可以打开 MMC 并加载 MSDTC 插件或使用以下脚本打开入站和出站交易。

https://technet.microsoft.com/en-us/library/cc731495.aspx

REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccess
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessTransactions
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessInbound
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessOutbound
PAUSE

REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccess /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessTransactions /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessInbound /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessOutbound /t REG_DWORD /d 1
PAUSE

net stop MSDTC
net start MSDTC
PAUSE

就我而言,服务已停止。解决方案:需要开启MSDTC服务

  1. 转到服务。 (开始 > 设置 > 控制面板 > 管理工具 > 服务)
  2. 找到名为“分布式事务处理协调器”的服务,然后 右键单击(在它上面 select)> 开始.
  3. 为运行自动提供此服务以永久解决此问题

'Distributed Transaction Coordinator' 服务不是 运行,因此启动服务并将服务类型也更改为自动。

我 运行 遇到了同样的错误,但是它不像来自非 运行 的分布式 T运行saction 协调器服务那么简单。我通过 windows 自动收到一个驱动程序更新,它导致 COM+ 出现问题并且不允许 MSDTC 正常通信,即使 MSDTC 服务是 运行。就我而言,这是 HP 热键驱动程序的问题,但在研究过程中,我发现其他制造商的音频驱动程序问题的其他报告也导致了此问题。

要检查是否有类似问题,请启动组件服务 (dcomcnfg.exe),然后展开组件服务 > 计算机 > 我的电脑,从此处单击 'COM+ Applications' 查看是否有将弹出 "COM+ unable to talk to Microsoft Distributed Transaction Coordinator" 错误,或者在导航中“我的电脑”的图标上会出现红色错误。

我的解决方法是禁用“HP 热键服务”和 "HotKeyServiceUWP" 服务。禁用这些服务后,MSDTC 立即开始工作。

我的问题已通过禁用冲突 service/driver 得到解决。我禁用了所有 HP 服务(HP App Helper、HP CASL、HP System Info),现在一切正常。

在我的例子中,我在远程服务器上有一个 Microsoft SQL 服务器的命名实例,我的应用程序的错误输出如下所示:

System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'SERVER\INST_NAME' is unavailable.

尝试使用 SQL 连接字符串,例如将 SERVER\INST_NAME 替换为 SERVER,TCP_PORT_NUMBER 没有帮助。我仍然遇到同样的错误,我决定安装一个默认实例 (MSSQLSERVER),这样 SQL 服务器名称就变成了 SERVER。这解决了问题,因为 RPC 和 MSDTC 开始解析名称。

Powershell 解决方案:

Get-Service -Name MSDTC | Set-Service -StartupType Automatic

最近这在我的工作机器(Win 10、MSSQL 2016 SP2 Express)上出现了问题。我没有链接服务器。这是凭空出现的。 MSDTC 服务是 运行,MSSQL 使用 Mgmt Studio 运行良好。但是,我的 .NET 4.7.1 单元测试应用程序拒绝连接数据库,并出现“服务器 '...' 上的 MSDTC 不可用”错误。

我找到的临时解决方法是添加“Enlist=False;”在连接字符串的末尾避免使用 MSDTC 进行连接。

此解决方案的来源是此主题下的评论:https://docs.microsoft.com/en-us/archive/blogs/distributedservices/intermittent-error-msdtc-on-server-servername-is-unavailable