在现代Windows操作系统中,分布式事务协调器(MSDTC)是一个关键组件,它负责协调跨越多个资源管理器的事务,例如数据库、消息队列和文件系统。MSDTC从Windows 2000开始就包含在内,并且也适用于Windows NT 4.0。
分布式事务允许客户端应用程序在一个事务中包含两个或更多网络系统中的不同数据源。例如,当应用程序或服务调用来自不同上下文的多个存储过程或实体框架语句时,可以使用DTC。
在任何数据驱动的应用程序中使用事务都非常重要,它不仅仅与数据库操作有关,还可能涉及到写入本地系统文件或注册表以及数据库操作。
在企业ERP系统的工作背景中,该系统架构在数据访问层使用Entity Framework,系统使用System.Transactions中的TransactionScope来维护和管理数据库操作。
唯一的问题是MSDTC是一个Windows服务,为分布式系统提供事务基础设施,这个服务需要在数据库和应用程序机器上运行,应该小心防火墙设置,并且应该正确配置MSDTC选项。这将影响应用程序部署。
提供了这个库作为工具,从程序管理MSDTC,以避免任何与用户PC上MSDTC配置相关的失败,还可以在系统设置自定义操作中使用它,以简化解决方案部署,并使其自动化和更有效,而不是手动处理每个设备。
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 Service: MsdtcManager有两个与MSDTC服务相关的属性:
MsdtcManager包括以下方法来管理MSDTC服务:
- GetServiceInfo(): ServiceInfo,返回包含MSDTC服务的一些信息的结构。
- GetServiceStatus(): ServiceControllerStatus,返回服务的当前状态,更详细的ServiceControllerStatus。
- StartService(): void,启动MSDTC服务。
- StopService(): void,停止MSDTC服务。
- RestartService(): void,重启MSDTC服务。
- InstallService(): void,安装MSDTC服务。
- UninstallService(): void,卸载MSDTC服务。
- RegMtxoci(): void,Mtxoci.dll是一个动态链接库(DLL),它与Microsoft Distributed Transaction Coordinator (DTC)一起内部使用,为Oracle数据库提供事务支持。
如果使用Windows防火墙来保护组织中的计算机,必须在Windows防火墙设置中将MSDTC添加到例外列表中。为此,MsdtcManager提供了以下方法:
- IsMsdtcRuleGroupEnabled(NET_FW_PROFILE_TYPE2_ profileType): bool,如果MSDTC规则组在Windows防火墙中启用,则返回true。
- EnableWindowsFirewallException(NET_FW_PROFILE_TYPE2_ profileType): void,启用Windows防火墙中的MSDTC规则组。
- DisableWindowsFirewallException(NET_FW_PROFILE_TYPE2_ profileType): void,禁用Windows防火墙中的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安装时的默认值。
如果想修改多个设置(这通常是最常见的情况),应该使用默认无参数构造函数或将autoRestartService设置为false来初始化MsdtcManager,其中一个参数(如果autoRestartService为true,MsdtcManager将在每次更改后需要重启时重启服务,这是不推荐的)更改设置后,可以检查是否需要重启服务,并如下重启它:
if(msdtcManager.NeedRestart)
{
msdtcManager.RestartService();
}
该项目包括一个演示应用程序,涵盖了这个库的所有功能。