全面接触微软事务服务MTS
胡朝晖
|
|
二、MTS的提出
尽管组件技术的出现,使软件开发的效率大大得到了提高,但是也出现了一些问题。比如如何实现对COM组件的事务处理和安全管理是COM组件出现后所面临的一个重大的问题,为了解决这个问题,微软推出了MTS系统,MTS使企业应用的开发人员把精力集中在对业务逻辑开发的基础上,而组件本身的安全性和通讯以及事务处理方面的问题交由MTS来进行处理。
MTS能够自动进行组件的事务处理和安全性配置。同时,MTS在数据库应用系统方面也表现了极强的能力,它能够使以数据库为核心的应用程序更好的和数据库进行交互,我们知道应用程序对数据库进行操作的时候,实际上都是通过和数据库建立一个连接,当处理完成后就释放这个连接,也就是说,这个连接实际上是由开发人员自己进行管理的,而出现了MTS以后,开发人员就不必去关心这个连接,它的释放完全交给MTS来进行处理,这样的好处是比如如果一个用户使用完一个连接以后,而另外一个用户要申请一个连接的话,可以马上就重用这个连接而不需要去重新创建一个连接,这样就降低了系统的开销。
另外,值得一提的是,MTS并不是仅仅支持SQL SERVER数据库,它同时还支持DB2和ORACLE等大型数据库系统。其实只要细心的开发人员就可以注意到在安装了MTS以后,在ODBC的设置上多了一个连接池(Connection Pooling)选项,这个实际上就表示MTS接管了对数据库连接的管理。
同时,MTS实现了复杂的组件管理技术,它能够自动支持组件的事务处理,能够进行基于角色(role)的安全管理,能够和各种数据库进行通讯,能够和MSMQ进行无缝集成,能够对组件的状态进行管理,通过一定的调度算法来实现对组件的操作。而且,单个应用可以被分隔成不同的包(package),不同的包实际上是在不同的进程中运行的,这样应用系统的容错能力就大大提高。
在具体开发领域,MTS允许开发人员用任何开发语言来建立应用系统,可以采用VB,VC,JAVA等开发工具。这里需要提到的一点是在微软以后的操作系统(Windows XP)中不再支持JAVA,实际上微软已经实现了一个C#的开发语言,它在功能和使用上要比JAVA更加方便和灵活(当然客观的讲,它能够比JAVA好的原因是它比JAVA推出的晚,可以修补JAVA的各种不足的地方,另外,它和.NET Framework有着紧密的联系)。 当然在WinNT环境下,MTS还是大有用武之地,MTS能够方便的调用COM组件,同时采用图形化的界面对COM组件进行管理,因此方便了基于COM服务器的应用程序的部署和开发。同时,MTS和微软的各种相关技术之间具有紧密的联系,比如Web服务器IIS和ASP剧本语言,NT集群(Cluster Service for Failover Protection)技术,同时和NT的认证安全技术紧密结合。
基于MTS的三层体系结构图可以用下图表示:
但是,在知道了MTS的作用和体系结构以后,我们如何构建一个能够在MTS下很好工作的组件呢?一般来说,需要遵守以下的准则:
1. 通过一个简单的API调用(GetObjectContext),创建一个对MTS Context对象的引用,创建这个引用能够使组件充分利用MTS的优点,比如安全性和事务处理能力。
2. 在组件中不要跨事务边界存储状态信息,一般来说,能够存储状态信息的组件的扩展性就会变差,因为当它们结束的时候,MTS不能循环使用它们的资源。所以,状态信息必须被保存在数据库中或者MTS的共享属性管理(Shared Property Manager)中,当需要的时候被组件所提取。
3. 当一个组件完成执行的时候,它必须在MTS Context对象上调用SetComplete方法,用来告诉MTS,当事务中的所有的组件完成任务以后,组件希望提交所有的工作。同时也告诉MTS,它能够重用被该组件所掌握的资源。
4. 如果一个组件不能成功的完成它的任务的时候,它必须MTS Context对象上调用SetAbort方法,用来告诉MTS它需要放弃当前的事务并进行相应的回滚(rollback),同时也告诉MTS,它能够重用被该组件所掌握的资源。 三、MTS的操作和应用范围介绍
需要注意的是,MTS是基于COM/DCOM技术之上的,主要在NT和9X平台上实现的(注意MTS是要从NT4 OPTION PACK上进行安装的),而随着W2K的推出,微软已经把重点放到COM+技术之上,COM+本身已经集成了MTS,在NT/9X平台上,你可以在“运行”对话框中输入“mtxexp.msc”来进行组件管理和配置。而这个管理工具在W2K下已经不存在了(注意W2K本身已经集成了组件事务处理功能,所以并不需要安装),你需要在“运行”对话框中输入“comexp.msc”来进行COM+组件的管理,需要注意的是,comexp.msc是在目录your_system_directory\system32\com之下的,你需要在环境变量的路径设置中加上“your_system_directory\system32\com”这个路径,以便在运行对话框中直接运行comexp.msc,当然在以后微软基于.NET Framework的操作系统版本推出后,所有的组件管理都要基于.NET运行库,其体系结构又要发生大的变化。
现在,我们已经知道了组件是放在MTS下进行统一管理的,接下来的问题是应用程序如何来使用这些组件呢?实际上这些组件可以被不同机器上的应用程序来使用,前提是这些客户端机器必须安装MTS。客户端是通过DCOM来进行标准的组件信息传输的,当然在能够运行DCOM之前,你必须进行一些配置:
1. 客户端注册表设置:最简单的方法是使用“Client Install Utility”这个工具,它能够自动对客户端的注册表进行设置,这个具体的配置是通过MTS Explorer来实现的(实际上就是mtxexp.msc这个东西)。下面的例子程序中会详细提到这一点。
2. 必须在客户端和服务器端同时进行个性化(impersonation)和认证(authentication)权限的配置。缺省的对个性化的设置是“identity”,对认证的设置是“connect”。实际上,开发人员可以通过“DCOMCNFG”这个工具来实现对缺省设置的修改,当然实际上微软并不推荐这个方法,更好的方法是在MTS Explorer中在package这个层次上进行安全性的设置。
|
|