有事务开销。然而, 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+对象永远不会运行在创建者的事务中 新的事务完全独立于创建者的事务 设置 Transaction Support 组件的 Transaction Support属性可以使用组件服务浏览器 Component Services Explorer,CSE) 配置,或者在组件的类型库中指定一个缺省的 Transaction Support设置。在组件的类型库中指定 个组件的 Transaction Support属性是有益的,因为当使用CSE从执行这项任务中解除一个管理 者时,可以减少不正确地配置组件的危险。然而,记住在组件的类型库中指定的 Transaction Support属性是一个缺省值,可以使用组件服务浏览器覆盖该值,这一点是很重要的 在使用组件服务浏览器对一个组件的 Transaction Support属性进行配置时,简单地打开一 个COM+应用程序的 Component Properties对话框,从 Transactions选项卡中选择五种可能的 Transaction Support.属性设置中的一个,如图19-5所示 Genera Transactions I secuity Activ I Concurency Advan on suppot x Supported imported Regared r Overide global transaction timeou value Tranaction 图19-5设置 Transaction Support的界面
有事务开销。然而, Transaction Support属性为Not Supported的对象总是在一个新的环 境中被激活。这与 D i s a b l e d相矛盾, D i s a b l e d的对象可以共享创建者的环境。 N o t S u p p o r t e d是缺省的Transaction Support属性值。 • 支持( S u p p o r t e d )当组件的Transaction Support属性设置为S u p p o r t e d时,组件的实例参与 存在的事务。但是组件对事务并没有要求,组件在事务不存在的情况下仍能很好地执行。 S u p p o r t e d属性只是表示支持事务,而不是必须要求事务存在。 • 需要( R e q u i r e d )当组件的Transaction Support属性设置为R e q u i r e d时,组件的实例总是在 事务内执行。在激活 C O M +对象前,C O M +将使用创建者的事务 (如果存在),或者新的 事务提供对象。不管哪种情况,组件实例总是在事务内执行。 • 需要新建(Requires New)当组件的Transaction Support属性设置为Requires New时,总是 在一个新的事务中激活组件的实例,即专为这个对象创建一个事务,而不管是否存在可 用的事务。这个设置为必须在事务中完成工作,但又必须把它的工作与所有其他的事务 分开的组件而设计的。使用这个设置时, C O M +对象永远不会运行在创建者的事务中。 新的事务完全独立于创建者的事务。 1. 设置Transaction Support 组件的Transaction Support属性可以使用组件服务浏览器(Component Services Explorer,CSE) 配置,或者在组件的类型库中指定一个缺省的Transaction Support设置。在组件的类型库中指定 一个组件的Transaction Support属性是有益的,因为当使用C S E从执行这项任务中解除一个管理 者时,可以减少不正确地配置组件的危险。然而,记住在组件的类型库中指定的 Tr a n s a c t i o n Support属性是一个缺省值,可以使用组件服务浏览器覆盖该值,这一点是很重要的。 在使用组件服务浏览器对一个组件的 Transaction Support属性进行配置时,简单地打开一 个C O M +应用程序的Component Properties对话框,从 Tr a n s a c t i o n s选项卡中选择五种可能的 Transaction Support属性设置中的一个,如图1 9 - 5所示。 图19-5 设置Transaction Support 的界面 第1 9章 A S P和事务性We b应用程序计计563 下载
564Asp高程 下载 如果使用的是C++,可以在组件类型库中为一个组件的 Transaction Support属性设置 个缺省值,可简单地通过在组件的接口定义语言(DL)的定义中增加相应的一行来实现。当该 组件被加到一个COM+的应用程序时,COM+读取类型库并且自动地使用存储于该类型库中的 Transaction Support,属性设置作为缺省值 Ⅴ isual basic6.0也允许开发者通过改变类模块的d MTSTransactionMode属性,为组件的 Transaction|ge Support属性设置指定一个缺省值。不要让这个属性的 名称欺骗了你, MTST ransaction Mode属性不但与MTS 一起工作,也和COM+一起工作。当编译一个项目时 isual basic将在组件的类型库中为 Transaction Suppor 属性的设置放置一个等价的常量值,如图196所示。 注意在 Visual basic中 MTSTransaction Mode值的技 术术语和组件服务浏览器中的术语是不完全相同的。图19.6设置 MTSTransaction mode 然而,不必担心,除了 Disabled(对COM+是新的)外, 属性的界面 每一个 Transaction Support属性级别都有一个对应的 MTSTransaction mode设置。表19-1中列了 所有可能的 MTSTransaction mode属性和他们的等价的COM+ Transaction Support属性 表19-1 MTSTransaction Mode属性与等价的cOM+ Transaction Support,属性的关系 MTSTransaction Mode属性 COM+ Transaction Support属性 0-NotAnMTSObject Not Suppored I-NoTransactions Not Suppored 3-Use Transaction Suppored 4-RequiresNewTransactions 当组件从 Registered Components列表中加入时,因为组件服务浏览器不读取 类型库,因此只要组件用 Add File对话框加到COM+应用程序中,就应用储存在组件 的类型库中的 Transaction Support属性设置。相反地,从 Registered Components 加入的COM+组件,如果不用组件服务浏览器修改它们的配置,则组件使用缺省的 Transaction Support属性配置,即 Not Supported 1932活动与同步 当事务处理系统为许多用户提供服务时,能从客户中接收同时发生的调用。因此,事务 处理系统必须考虑像多用户并发、同步和线程管理等问题。COM+能够处理这些问题,而且 允许创建在多用户分布式环境中执行的组件,其创建过程同创建为单个用户服务的组件一样 COM+通过使用活动( activity)来完成这个惊人的任务。在MTS中,活动是一个对象组,这 对象都在代表单个客户运行。在COM+中,活动是一个环境组,这些环境在代表单个客户 运行,环境可能含有一个或多个对象。然而,这仅是一个微小的差别,并且可以认为环境是 最内部的对象容器 活动确保服务于同一用户的两个对象不会同时执行。在一个活动中的对象被同步以阻止在这 个活动中并行地执行。活动可以由几个环境(包含着对象)组成,可以运行在分离的进程中,或者
如果使用的是V C + +,可以在组件类型库中为一个组件的 Transaction Support属性设置一 个缺省值,可简单地通过在组件的接口定义语言 ( I D L )的定义中增加相应的一行来实现。当该 组件被加到一个C O M +的应用程序时,C O M +读取类型库并且自动地使用存储于该类型库中的 Transaction Support属性设置作为缺省值。 Visual Basic 6.0也允许开发者通过改变类模块的 M T S Tr a n s a c t i o n M o d e属性,为组件的 Tr a n s a c t i o n S u p p o r t属性设置指定一个缺省值。不要让这个属性的 名称欺骗了你,MTST ransactionMode属性不但与M T S 一起工作,也和C O M +一起工作。当编译一个项目时, Visual Basic将在组件的类型库中为Transaction Support 属性的设置放置一个等价的常量值,如图1 9 - 6所示。 注意在Visual Basic中M T S Tr a n s a c t i o n M o d e值的技 术术语和组件服务浏览器中的术语是不完全相同的。 然而,不必担心,除了 D i s a b l e d (对C O M +是新的)外, 每一个Transaction Support属性级别都有一个对应的M T S Tr a n s a c t i o n M o d e设置。表1 9 - 1中列了 所有可能的M T S Tr a n s a c t i o n M o d e属性和他们的等价的C O M + Transaction Support属性。 表19-1 MTSTr a n s a c t i o n M o d e属性与等价的COM+ Transaction Support属性的关系 M T S Transaction Mode属性 COM+ Transaction Support属性 0-N o t A n M T S O b j e c t Not Suppored 1-N o Tr a n s a c t i o n s Not Suppored 2-R e q u i r e s Tr a n s a c t i o n R e q u i r e d 3-U s e Tr a n s a c t i o n S u p p o r e d 4-R e q u i r e s N e w Tr a n s a c t i o n s Requires New 当组件从Registered Components列表中加入时,因为组件服务浏览器不读取 类型库,因此只要组件用 Add File对话框加到C O M +应用程序中,就应用储存在组件 的类型库中的Transaction Support属性设置。相反地,从 Registered Components 加入的C O M +组件,如果不用组件服务浏览器修改它们的配置,则组件使用缺省的 Transaction Support属性配置,即Not Supported。 19.3.2 活动与同步 当事务处理系统为许多用户提供服务时,能从客户中接收同时发生的调用。因此,事务 处理系统必须考虑像多用户并发、同步和线程管理等问题。 C O M +能够处理这些问题,而且 允许创建在多用户分布式环境中执行的组件,其创建过程同创建为单个用户服务的组件一样。 C O M +通过使用活动( a c t i v i t y )来完成这个惊人的任务。在 M T S中,活动是一个对象组,这 些对象都在代表单个客户运行。在 C O M +中,活动是一个环境组,这些环境在代表单个客户 运行,环境可能含有一个或多个对象。然而,这仅是一个微小的差别,并且可以认为环境是 最内部的对象容器。 活动确保服务于同一用户的两个对象不会同时执行。在一个活动中的对象被同步以阻止在这 个活动中并行地执行。活动可以由几个环境(包含着对象)组成,可以运行在分离的进程中,或者 564计计ASP 3 高级编程 图19-6 设置M T S Tr a n s a c t i o n M o d e 属性的界面 下载
inapub.commi9sASRsstwrebsmeym565 运行在分离的机器上(稍微有一点限制)。由于这些原因,活动有时指的是运行的单个逻辑线程 为什么对象的同步如此重要?考虑一个最糟糕的情况,在完全相同的时刻,代表同一用 户服务的两个对象试图访问相同资源。每一个对象要完成自己的操作,就要阻塞其他对象的 运行。这种情况称为死锁。活动能防止发生死锁,这是通过每次只允许一个对象代表一个用 户运行来实现的。另外,活动在帮助COM+管理线程缓冲方面起着重要作用。 在MTS中,活动内对象的同步是通过将活动连接到单个物理线程,或是一个STA实施的 在一个活动中的对象不能并发执行,因为每个活动仅有一个物理线程。另外,COM+使用复 杂的锁定机制来确保活动中的同步。 每个活动保持着单一的独占锁。当在对象中调用一个方法并且对象的环境存在于一个活 动中时,在允许处理方法调用前,COM+首先要试图获得活动锁。如果获得锁,就由对象处 理调用,直到方法调用完成,才解除锁。如果不能获得锁,就阻塞方法调用,直到获得锁才 调用方法。虽然锁定过程更加复杂,但从高层次观点看,COM+使用逻辑的活动使得多个环 境和多个对象同步,基本上就是每一活动用一个单独的锁。使用锁的过程如图197所示。 COM+活动 ActivitylD=(JMC1150-514 Locked=True ActivityID=(JMCI150-514 环境 ActivityID=IJMC1150-514 图19-7使用锁的过程 环境能存在于创建者的活动或一个新的活动中或者根本没有活动。然而,单个环境不能 跨越多个活动。为了建立和保持这些关系,COM+为每个活动创建独特的用户标识符,称为 ActivityID,存储于每个环境中。 创建活动和 Synchronization属性 随着COM和MTS编程模型的集成,创建活动的方法也发生了改变。使用MTS,每个对象 属于一个活动。当ⅤB客户使用 CreateObject函数或New关键字(及某些表达式),或者 Visual C++客户使用 CoCreatelnstanceeX函数创建MTS对象时,自动地创建了活动。为了在已存在的 活动中创建对象,创建者必须调用 ObjectContext对象中的 Createlnstance函数 正如所想像的,这会导致大量的混乱,MTS的开发者必须意识到逻辑活动的边界,并且 恰当地使用标准的对象创建技术 Create Object or CocreatelnstanceEX)或者 ObjectContext对象 的 Createlnstance函数。 使用COM+,仍然能自动地创建活动,但是活动的创建是通过使用组件的 Synchronization 属性来控制的,而不是基于如何实例化一个组件。实际上, ObjectContext对象的 Createlnstance
运行在分离的机器上(稍微有一点限制)。由于这些原因,活动有时指的是运行的单个逻辑线程。 为什么对象的同步如此重要?考虑一个最糟糕的情况,在完全相同的时刻,代表同一用 户服务的两个对象试图访问相同资源。每一个对象要完成自己的操作,就要阻塞其他对象的 运行。这种情况称为死锁。活动能防止发生死锁,这是通过每次只允许一个对象代表一个用 户运行来实现的。另外,活动在帮助 C O M +管理线程缓冲方面起着重要作用。 在M T S中,活动内对象的同步是通过将活动连接到单个物理线程,或是一个 S TA实施的。 在一个活动中的对象不能并发执行,因为每个活动仅有一个物理线程。另外, C O M +使用复 杂的锁定机制来确保活动中的同步。 每个活动保持着单一的独占锁。当在对象中调用一个方法并且对象的环境存在于一个活 动中时,在允许处理方法调用前, C O M +首先要试图获得活动锁。如果获得锁,就由对象处 理调用,直到方法调用完成,才解除锁。如果不能获得锁,就阻塞方法调用,直到获得锁才 调用方法。虽然锁定过程更加复杂,但从高层次观点看, C O M +使用逻辑的活动使得多个环 境和多个对象同步,基本上就是每一活动用一个单独的锁。使用锁的过程如图 1 9 - 7所示。 图19-7 使用锁的过程 环境能存在于创建者的活动或一个新的活动中或者根本没有活动。然而,单个环境不能 跨越多个活动。为了建立和保持这些关系, C O M +为每个活动创建独特的用户标识符,称为 A c t i v i t y I D,存储于每个环境中。 1. 创建活动和S y n c h r o n i z a t i o n属性 随着C O M和M T S编程模型的集成,创建活动的方法也发生了改变。使用 M T S,每个对象 属于一个活动。当 V B客户使用 C r e a t e O b j e c t函数或 N e w关键字(及某些表达式 ),或者 Vi s u a l C + +客户使用C o C r e a t e I n s t a n c e E X函数创建M T S对象时,自动地创建了活动。为了在已存在的 活动中创建对象,创建者必须调用 O b j e c t C o n t e x t对象中的C r e a t e I n s t a n c e函数。 正如所想像的,这会导致大量的混乱, M T S的开发者必须意识到逻辑活动的边界,并且 恰当地使用标准的对象创建技术 (CreateObject or CoCreateInstanceEX)或者O b j e c t C o n t e x t对象 的C r e a t e I n s t a n c e函数。 使用C O M +,仍然能自动地创建活动,但是活动的创建是通过使用组件的 S y n c h r o n i z a t i o n 属性来控制的,而不是基于如何实例化一个组件。实际上, O b j e c t C o n t e x t对象的C r e a t e I n s t a n c e 第1 9章 A S P和事务性We b应用程序计计565 下载 COM+活动 ActivityID={JMC1150-514... Locked=True 环境 ActivityID={JMC1150-514... 环境 ActivityID={JMC1150-514... 环境 ActivityID={JMC1150-514... ASP
566Asp高程 Chinaopub coM 下载 函数现在的功能与标准的对象创建技术相同,并且它仅支持MTS的向后兼容性。另外,COM+ 提供激活活动外部的对象的能力。这样可避免mm 创建活动的额外开销和可能的调用阻塞,为频 繁使用的非事务性“工具”类型的组件提升性 能。如果需要,可以实现它们自己的锁定技 术。 同 Transaction Support属性一样 Synchronization属性在组件服务浏览器中的组 件 Properties对话框配置,如图198所示 对 Synchronization属性有五种可能的值 ·禁止( Disabled)当组件的 Synchronization 属性设置为 Disabled时,COM+将完全地 忽略组件的同步要求。正如当 Transaction Support,属性设置为 Disabled 时,COM+将首先试图在创建者的环境 图19-8配置 Synchronization属性的界面 中激活对象。如果创建者的环境无效或不相容,COM+将在一个新的环境中激活对象 如果对象继承创建者的环境,则对象可以分享创建者的活动,反之不能。应该在非事务 性组件中使用这种设置,无论何时,应尽量避免创建环境和活动的额外开销。 ·不支持( Not Supported)当组件的 Synchronization属性设置为 Not Supported时,对象的 环境将不存在于活动中。然而, Synchronization属性为 Not Supported的对象总是在一个 新的环境中被激活。 支持( Supported)当组件的 Synchronization属性设置为 Supported时,对象的环境是否存 在于活动中依赖于创建者的环境是否存在于活动中。然而,具有这种设置的组件不需要 活动,而且在没有活动的情况也能很好地执行 需要( Required)当组件的 Synchronization属性设置为 Required时,对象的环境将总是存 在于活动中。如果创建者环境存在于活动中,则新的对象将在创建者的活动中激活。否 则,COM+将在位于新活动中的新环境里激活对象 需要新建( Requires New)当组件的 Synchronization属性设置为 Requires new时,对象的 环境将总是在新的活动中创建,不管创建者的环境的同步状态如何 正如你所看到的, Synchronization)属性的选项和 Transaction Support属性的选项非常相似 然而,某些 Synchronization选项依赖于其他组件属性的某些值。特别是,支持JIT激活的组件 或 Transaction Support属性为 Supported、 Required和 Requires new的组件必须在活动中被激活 而且需要 Synchronization属性为 Required或 Requires new。只有当JⅠT激活被关闭并且 Transaction Support属性设置为 Disabled或 Not Supported时, Synchronization属性才能设置为 Disabled或 Not Supported。我们将在下一节更多地讨论事务与活动的关系 如果认为所有这些配置选项听起来有些令人困惑,不必担心。 Microsoft预料到这些互相依 赖的配置选项会使开发者记忆混乱,他们在组件服务浏览器中建立验证功能。如果改变JT激活 支持或者改变对 Synchronization,属性不相容的某些 Transaction Support.属性,组件服务浏览器器 将用警告消息提示并自动地调整 Synchronization属性来反映任何变化。警告消息如图19-9所
函数现在的功能与标准的对象创建技术相同,并且它仅支持 M T S的向后兼容性。另外,C O M + 提供激活活动外部的对象的能力。这样可避免 创建活动的额外开销和可能的调用阻塞,为频 繁使用的非事务性“工具”类型的组件提升性 能。如果需要,可以实现它们自己的锁定技 术。 同 Transaction Support 属 性 一 样 S y n c h r o n i z a t i o n属性在组件服务浏览器中的组 件P r o p e r t i e s对话框配置,如图1 9 - 8所示。 对S y n c h r o n i z a t i o n属性有五种可能的值: • 禁止(Disabled) 当组件的S y n c h r o n i z a t i o n 属性设置为D i s a b l e d时,C O M +将完全地 忽 略 组 件 的 同 步 要 求 。 正 如 当 Transaction Support属性设置为D i s a b l e d 时,C O M +将首先试图在创建者的环境 中激活对象。如果创建者的环境无效或不相容, C O M +将在一个新的环境中激活对象。 如果对象继承创建者的环境,则对象可以分享创建者的活动,反之不能。应该在非事务 性组件中使用这种设置,无论何时,应尽量避免创建环境和活动的额外开销。 • 不支持(Not Supported) 当组件的S y n c h r o n i z a t i o n属性设置为Not Supported时,对象的 环境将不存在于活动中。然而, S y n c h r o n i z a t i o n属性为Not Supported的对象总是在一个 新的环境中被激活。 • 支持(Supported) 当组件的S y n c h r o n i z a t i o n属性设置为S u p p o r t e d时,对象的环境是否存 在于活动中依赖于创建者的环境是否存在于活动中。然而,具有这种设置的组件不需要 活动,而且在没有活动的情况也能很好地执行。 • 需要(Required) 当组件的S y n c h r o n i z a t i o n属性设置为R e q u i r e d时,对象的环境将总是存 在于活动中。如果创建者环境存在于活动中,则新的对象将在创建者的活动中激活。否 则,C O M +将在位于新活动中的新环境里激活对象。 • 需要新建(Requires New) 当组件的S y n c h r o n i z a t i o n属性设置为Requires New时,对象的 环境将总是在新的活动中创建,不管创建者的环境的同步状态如何。 正如你所看到的,S y n c h r o n i z a t i o n属性的选项和Transaction Support属性的选项非常相似。 然而,某些S y n c h r o n i z a t i o n选项依赖于其他组件属性的某些值。特别是,支持 J I T激活的组件 或Transaction Support属性为S u p p o r t e d、R e q u i r e d和Requires New的组件必须在活动中被激活, 而且需要 S y n c h r o n i z a t i o n属性为 R e q u i r e d或Requires New 。只有当 J I T激活被关闭并且 Transaction Support属性设置为D i s a b l e d或Not Supported时,S y n c h r o n i z a t i o n属性才能设置为 D i s a b l e d或Not Supported。我们将在下一节更多地讨论事务与活动的关系。 如果认为所有这些配置选项听起来有些令人困惑,不必担心。 M i c r o s o f t预料到这些互相依 赖的配置选项会使开发者记忆混乱,他们在组件服务浏览器中建立验证功能。如果改变 J I T激活 支持或者改变对S y n c h r o n i z a t i o n属性不相容的某些Transaction Support属性,组件服务浏览器器 将用警告消息提示并自动地调整S y n c h r o n i z a t i o n属性来反映任何变化。警告消息如图1 9 - 9所示。 566计计ASP 3 高级编程 下载 图19-8 配置S y n c h r o n i z a t i o n属性的界面
China pub.coM mIng AS RI S#tws /B EIr 567 The transaction level or just in time activation setting that was just selected is not compatible with the currently selected synchronization level, The synchronization level wil be changed to a compatible level 图19-9警告消息 关于活动,最好的优点是它们全部通过COM+在幕后执行,组件不需要做任何附加工作 COM+提供了自动的并行和同步服务。另外,对非事务性组件提供了禁止创建活动的功能 尽管如此,理解 Synchronization属性变化的作用和活动与环境在幕后如何运行是很重要的,这 样才能设计出高效和可扩展的组件。现在我们对事务性COM+组件的可配置属性有了一定的 了解,下面讨论事务的生存期的每一阶段。 19.33事务的生存期 COM+事务生存期可分为四个阶段,分别是: 事务开始。 ·建立并征募与 Resource manager的连接 在事务中执行操作 输出事务结果并结束。 重要的是记住只有 Transaction Support属性不是 Disabled或 Not Supported时组件才需要参 与事务。COM+组件同样能可选地表决事务的结果 下面详细看一下在单个和多个对象的COM+事务中,事务生存期的每一阶段的具体情况。 事务开始 使用COM+事务模型,组件不会显式地启动一个COM+事务。相反,COM+在两种情况下 自动地创建一个新的COM+事务 Transaction Support属性为 Required的组件由非事务性的客户激活 Transaction Support属性为 Requires New的组件由任何客户激活。 个COM+事务由两部分组成 逻辑事务。 物理事务。 逻辑事务也称为事务流,是共享一个物理事务的对象的一个逻辑集合或逻辑组。另一方 面,物理事务是基本的 MS DTC事务,使用两阶段提交协议,根据数据源协调事务结果。当物 理事务由COM+创建时,它使用最高级别的隔离(可串行的)创建,并且在组件服务浏览器中指 定事务超时间隔。COM+从基本的物理事务中完全地抽象对象,而不是让我们通过逻辑事务 流和每个对象的环境管理事务 尽管逻辑事务可以由几个COM对象组成,但是事务流(逻辑事务)与物理事务始终存在ˉ 对应关系,这一点非常重要 在事务流中创建的第一个对象,称为事务的根。事务的根能够通过实例化组件在同一事 务中可选择地征募其他的COM+对象,这些被实例化的COM+组件的 Transaction Support属性 为 Required或者 Supported。在这同一事务中创建对象时,COM+自动地将根对象的环境事务
图19-9 警告消息 关于活动,最好的优点是它们全部通过 C O M +在幕后执行,组件不需要做任何附加工作, C O M +提供了自动的并行和同步服务。另外,对非事务性组件提供了禁止创建活动的功能。 尽管如此,理解S y n c h r o n i z a t i o n属性变化的作用和活动与环境在幕后如何运行是很重要的,这 样才能设计出高效和可扩展的组件。现在我们对事务性 C O M +组件的可配置属性有了一定的 了解,下面讨论事务的生存期的每一阶段。 19.3.3 事务的生存期 C O M +事务生存期可分为四个阶段,分别是: • 事务开始。 • 建立并征募与Resource Manager的连接。 • 在事务中执行操作。 • 输出事务结果并结束。 重要的是记住只有 Transaction Support属性不是D i s a b l e d或Not Supported时组件才需要参 与事务。C O M +组件同样能可选地表决事务的结果。 下面详细看一下在单个和多个对象的 C O M +事务中,事务生存期的每一阶段的具体情况。 1. 事务开始 使用C O M +事务模型,组件不会显式地启动一个 C O M +事务。相反,C O M +在两种情况下 自动地创建一个新的C O M +事务: • Transaction Support属性为R e q u i r e d的组件由非事务性的客户激活。 • Transaction Support属性为Requires New的组件由任何客户激活。 一个C O M +事务由两部分组成: • 逻辑事务。 • 物理事务。 逻辑事务也称为事务流,是共享一个物理事务的对象的一个逻辑集合或逻辑组。另一方 面,物理事务是基本的MS DTC事务,使用两阶段提交协议,根据数据源协调事务结果。当物 理事务由C O M +创建时,它使用最高级别的隔离 (可串行的)创建,并且在组件服务浏览器中指 定事务超时间隔。 C O M +从基本的物理事务中完全地抽象对象,而不是让我们通过逻辑事务 流和每个对象的环境管理事务。 尽管逻辑事务可以由几个 C O M +对象组成,但是事务流 (逻辑事务)与物理事务始终存在一 一对应关系,这一点非常重要。 在事务流中创建的第一个对象,称为事务的根。事务的根能够通过实例化组件在同一事 务中可选择地征募其他的 C O M +对象,这些被实例化的 C O M +组件的Transaction Support属性 为R e q u i r e d或者S u p p o r t e d。在这同一事务中创建对象时, C O M +自动地将根对象的环境事务 第1 9章 A S P和事务性We b应用程序计计567 下载