与企业服务和 COM+ 事务的互操作性
System.Transactions 命名空间支持使用此命名空间创建的事务对象与通过 COM+ 创建的事务之间的互操作性。
在创建新的 TransactionScope 实例时,可以使用 EnterpriseServicesInteropOption 枚举来指定与 COM+ 的互操作性的级别。
默认情况下,当应用程序代码检查静态 Current 属性时,System.Transactions 会尝试查找当前事务或指示 Current 为 null 的 TransactionScope 对象。如果找不到上述任何一项,则 System.Transactions 会查询事务的 COM+ 上下文。请注意,即使 System.Transactions 可从 COM+ 上下文中找到事务,它仍会首选 System.Transactions 的本机事务。
互操作性级别
EnterpriseServicesInteropOption 枚举定义了下列互操作性级别:None、Full 和 Automatic。
TransactionScope 类提供的构造函数接受 EnterpriseServicesInteropOption 作为参数。
顾名思义,None 表示 System.EnterpriseServices 上下文与事务范围之间不存在互操作性。在用 None 创建 TransactionScope 对象后,对 Current 的任何更改都不会在 COM+ 上下文中反映出来。同样,对 COM+ 上下文中事务的更改也不会在 Current 中反映出来。这是 System.Transactions 最快速的操作模式,因为不需要任何额外的同步。None 是 TransactionScope 对所有不接受 EnterpriseServicesInteropOption 作为参数的构造函数采用的默认值。
如果需要将 System.EnterpriseServices 事务与环境事务组合在一起,则需要使用 Full 或 Automatic。由于这两个值都依赖于一项无需组件即可调用服务的功能,因此在使用它们时,应在 Windows XP Service Pack 2 或 Windows Server 2003 上运行。
Full 指定 System.Transactions 和 System.EnterpriseServices 的环境事务始终是相同的。这会创建一个新的 System.EnterpriseServices 事务性上下文,并使 TransactionScope 的当前事务成为该上下文的当前事务。因此,Current 中的事务与 Transaction 中的事务完全保持同步。该值会导致性能损失,因为可能会创建新的 COM+ 上下文。
Automatic 指定下列要求:
选中 Current 时,如果 System.Transactions 检测到它没有运行在默认上下文中,则应支持 COM+ 上下文中的事务。请注意,默认上下文不能包含事务。因此,在默认上下文中,即使使用 Automatic,也会对 Current 返回 System.Transactions 所使用的、存储在线程本地存储区中的事务。
如果创建一个新的 TransactionScope 对象,并在默认上下文之外的上下文中执行此操作,则 TransactionScope 对象的当前事务应在 COM+ 中反映出来。在这种情况下,Automatic 的行为与 Full 类似,因为前者会创建新的 COM+ 上下文。
此外,当在 Full 和 Automatic 中设置了 Current 时,这两种模式都表示不能直接设置 Current。任何直接设置 Current 而不是创建 TransactionScope 的尝试都会导致 InvalidOperationException。EnterpriseServicesInteropOption 枚举值由未显式指定要使用哪个值的新事务范围继承。例如,如果用 Full 创建新的 TransactionScope 对象,然后创建另一个 TransactionScope 对象,但不指定 EnterpriseServicesInteropOption 值,则第二个 TransactionScope 对象也具有 Full 值。
总之,在创建新的事务范围时,应遵守下列规则:
检查 Current 以确定是否存在事务。此检查会执行下列操作:
检查是否存在范围。
如果存在范围,则选中最初创建该范围时传入的 EnterpriseServicesInteropOption 枚举值。
如果将 EnterpriseServicesInteropOption 枚举设置为 Automatic,则 COM+ 事务(System.EnterpriseServices 事务)将优先于托管线程本地存储区中的 System.Transactions 事务。
如果将该枚举值设置为 None,则托管线程本地存储区中的 System.Transactions 事务将优先。
如果该枚举值为 Full,则仅存在一个事务,并且该事务是 COM+ 事务。
检查由 TransactionScope 构造函数传入的 TransactionScopeOption 枚举值。这样可确定是否必须创建新事务。
如果需要创建新事务,则会生成 EnterpriseServicesInteropOption 的下列值:
Full:创建与 COM+ 上下文关联的事务。
None:创建 System.Transactions 事务。
Automatic:如果存在 COM+ 上下文,则会创建一个事务,并将其附加到该上下文。
下表使用 EnterpriseServicesInteropOption 枚举阐释了企业服务 (ES) 上下文和需要事务的事务范围。
ES 上下文 | None | Automatic | Full |
---|---|---|---|
默认上下文 |
默认上下文 |
默认上下文 |
创建新的事务上下文 |
非默认上下文 |
保持客户端的上下文 |
创建新的事务上下文 |
创建新的事务上下文 |
下表使用 EnterpriseServicesInteropOption 枚举阐释了环境事务(给定特定的 System.EnterpriseServices 上下文)和需要事务的事务范围。
ES 上下文 | None | Automatic | Full |
---|---|---|---|
默认上下文 |
ST |
ST |
ES |
非默认上下文 |
ST |
ES |
ES |
在上表中:
ST 表示范围的环境事务由 System.Transactions 管理,这一点不同于可能存在的任何 System.EnterpriseServices 上下文的事务。
ES 表示范围的环境事务与 System.EnterpriseServices 上下文的事务相同。
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。