日期:2012-03-02  浏览次数:21177 次


     在前几章我们已经看到COM+提供的几种运行期特性,它们使得分布式组件的开发简单化,这些组件可用于创建可扩展、可维护的ASP应用程序。MTS最先引进了事务模型,它的设计简化了基于组件的分布式事务处理系统的开发。作为MTS的继承者, COM+增强并扩充了MTS的强大的事务模型,给系统提供更多灵活性和简单化。
    COM+事务模型去掉了复杂的事务处理代码,这些代码是通过MS DTC协调分布式事务所必需的。但是更重要的是, COM+事务模型透明地融合了分布式事务与COM+组件。
    通过使用声明( declarative )属性实现的COM+事务,有时也称为声明事务或自动事务。声明属性能从外部指定到组件的实现。为此,必须:
    ? 配置组件的Transaction Support属性,使用Component Services Explorer或者在组件类型库中使用一个常数值。
    ? 可选修改组件来表决事务的结果。
    通过代表组件与MS DTC交互,COM+自动地处理其余的复杂且冗长的事务细节。
    因为COM+依赖于MS DTC协调事务,单个组件能够在单个COM+事务中对不同类型的数据源执行操作。当与组件一起使用COM+声明事务时,能影响ADO或OLE DB数据访问。在单个事务中能够操作的数据源的可能组合是无止境的。例如, COM+对象能够在SQL Server数据库中修改数据、发送MSMQ消息,以及操作来自大型机系统的数据,所有这一切都在相同的COM+事务中。
    现在我们明白了COM+事务的益处,下面继续学习如何有效地使用声明事务模型并了解COM+在“幕后”所做的事。
19.3.1 Transaction Support属性
    正如上面提到的,每个COM+组件的Transaction Support 属性决定了组件将如何参与COM+事务。激活COM+对象时,COM+决定了对象的事务支持以及创造者是否已经提供了一个存在的事务。基于这两方面的信息, COM+运行期将在一个存在的事务或一个新的事务中提供对象,或者根本不存在事务。不管有没有事务,都能激活每一个COM+对象。由于这个原因,利用事务的组件常常被称为事务性组件,没有利用事务的组件则称为非事务性组件。
    使用COM+时有五种可能的Transaction Support属性选项:
    ? 禁止( Disabled )当组件的Transaction Support属性设置为Disabled时,COM+将完全地忽略组件的事务要求。COM+首先试图在创建者的环境内激活对象。如果创建者的环境是无效的或不兼容的, COM+在一个新的环境中激活对象。由于对象可能继承或不继承创建者的环境,则对象也就可能共享或不共享创建者的事务。
    ? 不支持(Not Supported)当组件的Transaction Support属性设置为Not Supported时,组件的实例决不参与事务。这种设置是为不访问数据源的COM+组件设计的,其结果是组件没有事务开销。然而, Transaction Support属性为Not Supported的对象总是在一个新的环境中被激活。这与Disabled相矛盾, Disabled的对象可以共享创建者的环境。NotSupported是缺省的Transaction Support属性值。
    ? 支持(Supported)当组件的Transaction Support属性设置为Supported时,组件的实例参与存在的事务。但是组件对事务并没有要求,组件在事务不存在的情况下仍能很好地执行。Supported属性只是表示支持事务,而不是必须要求事务存在。
    ? 需要( Required )当组件的Transaction Support属性设置为Required时,组件的实例总是在事务内执行。在激活COM+对象前, COM+将使用创建者的事务(如果存在),或者新的事务提供对象。不管哪种情况,组件实例总是在事务内执行。
    ? 需要新建(Requires New)当组件的Transaction Support属性设置为Requires New时,总是在一个新的事务中激活组件的实例,即专为这个对象创建一个事务,而不管是否存在可用的事务。这个设置为必须在事务中完成工作,但又必须把它的工作与所有其他的事务分开的组件而设计的。使用这个设置时, COM+对象永远不会运行在创建者的事务中。新的事务完全独立于创建者的事务。
    1. 设置Transaction Support
    组件的Transaction Support属性可以使用组件服务浏览器(Component Services Explorer,CSE)配置,或者在组件的类型库中指定一个缺省的Transaction Support设置。在组件的类型库中指定一个组件的Transaction Support属性是有益的,因为当使用CSE从执行这项任务中解除一个管理者时,可以减少不正确地配置组件的危险。然而,记住在组件的类型库中指定的TransactionSupport属性是一个缺省值,可以使用组件服务浏览器覆盖该值,这一点是很重要的。
    在使用组件服务浏览器对一个组件的Transaction Support属性进行配置时,简单地打开一个COM+应用程序的Component Properties对话框,从Transactions选项卡中选择五种可能的Transaction Support属性设置中的一个,如图1 9 - 5所示。

    如果使用的是V C++,可以在组件类型库中为一个组件的Transaction Support属性设置一个缺省值,可简单地通过在组件的接口定义语言( I D L )的定义中增加相应的一行来实现。当该组件被加到一个COM+的应用程序时,COM+读取类型库并且自动地使用存储于该类型库中的Transaction Support属性设置作为缺省值。
    Visual Basic 6.0也允许开发者通过改变类模块的MTS Transaction Mode属性,为组件的TransactionSupport属性设置指定一个缺省值。不要让这个属性的名称欺骗了你,MTST ransactionMode属性不但与MTS一起工作,也和COM+一起工作。当编译一个项目时,Visual Basic将在组件的类型库中为Transaction Support属性的设置放置一个等价的常量值,如图1 9 - 6所示。

    注意在Visual Basic中MTS Transaction Mode值的技术术语和组件服务浏览器中的术语是不完全相同的。然而,不必担心,除了Disabled (对COM+是新的)外,每一个Transaction Support属性级别都有一个对应的MTS Transaction Mode设置。表19 - 1中列了所有可能的MTS Transaction Mode属性和他们的等价的COM+ Transaction Support属性。