.NET 代码,执行 SQL Server 事务,提示错误:
MSDTC on server ... is unavailable.(以下简称 MSDTC 不可用)
解决办法
运行 services.msc。
服务中找到 Distributed Transaction Coordinator。
发现是禁用的,将其启用,并设置为自动启动,解决。
进一步
准备工作
.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,会正常运行。