MSDTC管理器






4.80/5 (15投票s)
MSDTC管理器
引言
分布式事务协调器 (MSDTC) 服务是 Microsoft Windows 现代版本的一个组件,负责协调跨多个资源管理器(如数据库、消息队列和文件系统)的事务。MSDTC 包含在 Windows 2000 及更高版本的操作系统中,也适用于 Windows NT 4.0。
分布式事务允许客户端应用程序在一个事务中包含两个或多个联网系统上的几个不同数据源。例如,当您的应用程序或服务从不同上下文中调用多个存储过程或实体框架语句时,您可以使用 DTC。
在任何数据驱动的应用程序中,使用事务都非常重要,它不仅与数据库操作相关,还可能涉及写入本地系统文件或注册表以及数据库操作。
有关 TransactionScope
用法和优点的更多详细信息,请阅读此文章:关于 TransactionScope 的所有内容。
背景
在我开发一个使用实体框架作为数据访问层的企业 ERP 系统期间,该系统使用 System.Transactions
中的 TransactionScope
来维护和管理数据库操作。
唯一的问题是 MSDTC 是一个为分布式系统提供事务基础设施的 Windows 服务,该服务需要在数据库和应用程序机器上都启动并运行,您应该注意防火墙设置,并且还应该正确配置 MSDTC 的选项。
这将影响应用程序部署。
我提供这个库作为一种工具,可以通过您的程序管理 MSDTC,以避免用户 PC 上与 MSDTC 配置相关的任何故障,您也可以在您的系统安装自定义操作中使用它,以简化解决方案的部署,使其自动化且更有效,而不是为每个设备手动处理。
Using the Code
MsdtcManager
是您开始使用此库所需的类,首先您应该在代码中实例化它,所以让我们从它的构造函数开始。
您可以通过以下三种方式实例化 MsdtcManager
MsdtcManager(bool autoRestartService, int timeoutMilliseconds)
两个参数构造函数
- autoRestartService:如果为
true
,MsdtcManager
将在每次配置更改需要服务重启时重启服务 - timeoutMilliseconds:
MsdtcManager
将等待 MSDTC 服务达到指定状态或指定超时到期的时间段,以毫秒为单位
MsdtcManager(bool autoRestartService)
timeoutMilliseconds
默认值为 250 毫秒。
MsdtcManager();
无参数默认构造函数,timeoutMilliseconds
默认值为 250 毫秒,autoRestartService
默认值为 false
。
一般属性
MsdtcManager
有两个与 MSDTC 服务相关的属性
属性 | 数据类型 | 可用选项 |
---|---|---|
NeedRestart | bool | 检测 MSDTC 服务在配置中任何需要服务重启的更改后是否需要重启。如果 autoRestartService 值为 true ,将自动处理重启服务,否则您应该通过调用 MsdtcManager.RestartService(); 来重启服务 |
MSDTC 服务
MsdtcManager
有两个与 MSDTC 服务相关的属性
属性 | 数据类型 | 描述 |
---|---|---|
IsServiceInstalled | bool | 如果 MSDTC 服务已安装(如前所述,MSDTC 自 Windows 2000 起包含),则返回 true |
IsServiceInstalledAndRunning | bool | 如果 MSDTC 服务已安装并正在运行,则返回 true |
MsdtcManager
包含以下方法来管理 MSDTC 服务
方法 | 返回值 | 描述 |
---|---|---|
GetServiceInfo() | 服务信息 | 返回包含有关 MSDTC 服务的一些信息的 struct 。 |
GetServiceStatus() | ServiceControllerStatus | 返回服务的当前状态,有关更详细的信息,请参阅 ServiceControllerStatus。 |
StartService() | void | 启动 MSDTC 服务。 |
StopService() | void | 停止 MSDTC 服务。 |
RestartService() | void | 重启 MSDTC 服务。 |
InstallService() | void | 安装 MSDTC 服务 |
UninstallService() | void | 卸载 MSDTC 服务。 |
RegMtxoci() | void | Mtxoci.dll 是一个动态链接库 (DLL),由 Microsoft ODBC Driver for Oracle 和 Microsoft OLEDB Provider for Oracle 在内部使用,与 Microsoft 分布式事务协调器 (DTC) 结合使用,为 Oracle 数据库提供事务支持。具体来说,它将 DTC 事务转换为 Oracle 可以理解的 XA 事务。此组件目前无法跟踪它接收到的 DTC 和应用程序消息,也无法跟踪它发送的 XA 消息。这使得解决某些问题变得极其困难。 |
防火墙
如果您使用 Windows 防火墙保护组织中的计算机,则必须将 MSDTC 添加到 Windows 防火墙设置中的例外列表中。为此,MsdtcManager
提供以下方法
属性 | 数据类型 | 描述 |
---|---|---|
IsMsdtcRuleGroupEnabled(NET_FW_PROFILE_TYPE2_ profileType) | bool | 如果 MSDTC 规则组在 Windows 防火墙中已启用,则返回 true ,否则返回 false 。 |
EnableWindowsFirewallException(NET_FW_PROFILE_TYPE2_ profileType) | void | 在 Windows 防火墙中启用 MSDTC 规则组 |
DisableWindowsFirewallException(NET_FW_PROFILE_TYPE2_ profileType) | void | 在 Windows 防火墙中禁用 MSDTC 规则组 |
MSDTC 配置
MsdtcManager
提供以下属性和方法来处理 MSDTC 设置
属性 / 方法 | 描述 |
---|---|
NetworkDtcAccess | 获取或设置值,该值确定本地计算机上的 MSDTC 是否可以访问网络。此设置必须与其他设置之一结合启用,才能启用网络 MSDTC 事务。 |
AllowInbound | 获取或设置值,该值允许源自远程计算机的分布式事务在此计算机上运行。 |
AllowOutbound | 获取或设置值,该值允许本地计算机发起事务并在远程计算机上运行。 |
AuthenticationRequired | 获取或设置所需的身份验证类型,可用值:MutualAuthenticationRequired 、IncomingCallerAuthenticationRequired 、NoAuthenticationRequired 。 |
EnableXaTransactions | MSDTC 可以充当符合 XA 标准的资源管理器或事务管理器。当 DTC 充当符合 XA 标准的资源管理器时,它允许 SQL Server、消息队列 (MSMQ) 和其他符合 OLE 事务标准的资源管理器参与由 X/Open DTP XA 标准事务处理监视器控制的事务。 |
EnableSnaLuTransactions | 支持 IBM CICS LU 6.2 事务。 |
ResetToDefaultSettings | 将 MSDTC 设置为其 Windows 安装时的默认值。 |
如果您想修改多个设置(通常这是最常见的场景),您应该使用默认的无参数构造函数实例化 MsdtcManager
或将 autoRestartService
设置为 false
,带参数的构造函数(如果 autoRestartService
为 true
,MsdtcManager
将在每次更改后重启服务,这是不推荐的)在更改设置后,您可以检查是否需要重启服务并按如下所示重启它
if (msdtcManager.NeedRestart)
{
msdtcManager.RestartService();
}
演示示例
该项目包含一个演示应用程序,以涵盖此库的所有功能。
关注点
此库基于此 MSDN 页面:分布式事务协调器
请仔细阅读它以了解您需要如何正确配置它,您也可以阅读此文章以了解如何手动设置配置:使用 .NET TransactionScope 时 MSDTC 服务启用问题。
- 支持 XA 事务
历史
- 2014-02-19 首次发布 (Beta 版)
- 2014-02-27 版本 1 {新增:InstallService, UninstallService, ChangeLogonAccount, RegMtxoci, EnableXaTransactions, EnableSnaLuTransactions}