SQL 事务时 MSDTC on server is unavailable.

作者:vkvi 来源:ITPOW(原创) 日期:2022-6-14

.NET 代码,执行 SQL Server 事务,提示错误:

MSDTC on server ... is unavailable.(以下简称 MSDTC 不可用

解决办法

运行 services.msc

服务中找到 Distributed Transaction Coordinator

发现是禁用的,将其启用,并设置为自动启动,解决。

MSDTC

进一步

准备工作

.NET 事务技术-System.Transactions.TransactionScope 隐式事务(方便)

程序 A:using 创建了一个事务连接(SQL Server),这个 using {} 内:

  • 一个 SQL 是使用了事务的 Connection 的。

  • 另一 SQL 是自己额外创建的一个普通 Connection。

  • 最后事务 Complete()。

如果是访问本机数据库,不论是下面哪种连接:

Server=.; Initial Catalog=SoilInfo; Integrated Security=SSPI;
Server=192.168.2.117; database=SoilInfo; uid=itpow; pwd=123ddd456;
Data Source=192.168.2.117; Initial Catalog=SoilInfo; User ID=itpow; Password=123ddd456;

(此处 192.168.2.117 是本机的 IP)

当本文前面提到的服务(简称 MSDTC):

  • 启动类型为手动、运行状态为停止,运行程序:MSDTC 被唤醒运行,SQL 正常运行(与非本机数据库不同)

  • 启动类型为禁用、运行状态为停止,运行程序:由于 MSDTC 无法被唤醒,SQL 无法正常运行,提示 MSDTC 不可用

如果访问非本机数据库:

当本文前面提到的服务(简称 MSDTC):

程序机启动类型为手动、运行状态为停止数据库机启动类型为手动、运行状态为停止,运行程序:两台MSDTC 被唤醒运行,但 SQL 无法正常运行,提示该事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D024)(与本机数据库不同)

程序机启动类型为手动、运行状态为停止数据库机启动类型为禁用、运行状态为停止,运行程序:程序机 MSDTC 被唤醒运行,由于数据库机 MSDTC 无法被唤醒,SQL 无法正常运行,提示 MSDTC 不可用

程序机启动类型为禁用、运行状态为停止数据库机启动类型为禁用、运行状态为停止,运行程序:由于程序机和数据库机 MSDTC 被唤醒运行,SQL 无法正常运行,提示 MSDTC 不可用

已经晕了,总结如下:

  • MSDTC 如果是手动,通常会被唤醒, 也就是说我们不去人工启动它,也是 OK 的,但是如果是禁用,就没法了。

  • 所以使用事务,必须保证程序机数据库机,其 MSDTC 都没禁用

  • MSDTC 正常的情况下:

    • 程序机、数据库机为同一机子,事务套非事务,非事务按事务运行(经测试第 2 个 SQL 确实也是按事务执行的)

    • 程序机、数据库机为非同一机子,事务套非事务,异常

使用事务,一定要使用 MSDTC 吗?

其实不是,而是使用多个连接时,才需要(比如前面事务连接非事务连接)。

我们也可以用测试来证明,将前面的第 2 个 SQL 也使用事务的连接,然后禁用、停止 MSDTC,会正常运行。

相关文章