繁体中文
设为首页
加入收藏
当前位置:ASP技术首页 >> ASP基础 >> 事务性COM+应用程序

事务性COM+应用程序

2005-11-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:在前几章我们已经看到COM+提供的几种运行期特性,它们使得分布式组件的开发简单化,这些组件可用于创建可扩展、可维护的ASP应用程序。MTS最先引进了事务模型,它的设计简化了基于组件的分布式事务处理系统的开发...

在前几章我们已经看到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的对象可以共享创建者的环境。Not

Supported是缺省的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从执行这项任务中解除一个管理者时,可以减少不正确地配置组件的危险。然而,记住在组件的类型库中指定的Transaction

Support属性是一个缺省值,可以使用组件服务浏览器覆盖该值,这一点是很重要的。

在使用组件服务浏览器对一个组件的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属性,为组件的Transaction

Support属性设置指定一个缺省值。不要让这个属性的名称欺骗了你,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属性。

当组件从Registered Components列表中加入时,因为组件服务浏览器不读取类型库,因此只要组件用Add File对话框加到COM+应用程序中,就应用储存在组件的类型库中的Transaction Support属性设置。相反地,从Registered Components加入的COM+组件,如果不用组件服务浏览器修改它们的配置,则组件使用缺省的Transaction Support属性配置,即Not Supported。

19.3.2 活动与同步

当事务处理系统为许多用户提供服务时,能从客户中接收同时发生的调用。因此,事务处理系统必须考虑像多用户并发、同步和线程管理等问题。COM+能够处理这些问题,而且允许创建在多用户分布式环境中执行的组件,其创建过程同创建为单个用户服务的组件一样。

COM+通过使用活动(activity )来完成这个惊人的任务。在MTS中,活动是一个对象组,这些对象都在代表单个客户运行。在COM+中,活动是一个环境组,这些环境在代表单个客户运行,环境可能含有一个或多个对象。然而,这仅是一个微小的差别,并且可以认为环境是最内部的对象容器。

活动确保服务于同一用户的两个对象不会同时执行。在一个活动中的对象被同步以阻止在这个活动中并行地执行。活动可以由几个环境(包含着对象)组成,可以运行在分离的进程中,或者运行在分离的机器上(稍微有一点限制)。由于这些原因,活动有时指的是运行的单个逻辑线程。

为什么对象的同步如此重要?考虑一个最糟糕的情况,在完全相同的时刻,代表同一用户服务的两个对象试图访问相同资源。每一个对象要完成自己的操作,就要阻塞其他对象的运行。这种情况称为死锁。活动能防止发生死锁,这是通过每次只允许一个对象代表一个用

户运行来实现的。另外,活动在帮助COM+管理线程缓冲方面起着重要作用。

在MTS中,活动内对象的同步是通过将活动连接到单个物理线程,或是一个STA实施的。在一个活动中的对象不能并发执行,因为每个活动仅有一个物理线程。另外, COM+使用复杂的锁定机制来确保活动中的同步。

每个活动保持着单一的独占锁。当在对象中调用一个方法并且对象的环境存在于一个活动中时,在允许处理方法调用前, COM+首先要试图获得活动锁。如果获得锁,就由对象处理调用,直到方法调用完成,才解除锁。如果不能获得锁,就阻塞方法调用,直到获得锁才调用方法。虽然锁定过程更加复杂,但从高层次观点看, COM+使用逻辑的活动使得多个环境和多个对象同步,基本上就是每一活动用一个单独的锁。使用锁的过程如图1 9 - 7所示。

责任编辑:admin
相关文章