与企业服务和 COM+ 事务的互操作性

System.Transactions 命名空间支持使用此命名空间创建的事务对象与通过 COM+ 创建的事务之间的互操作性。

在创建新的 TransactionScope 实例时,可以使用 EnterpriseServicesInteropOption 枚举来指定与 COM+ 的互操作性的级别。

默认情况下,当应用程序代码检查静态 Current 属性时,System.Transactions 会尝试查找当前事务或指示 CurrentnullTransactionScope 对象。如果找不到上述任何一项,则 System.Transactions 会查询事务的 COM+ 上下文。请注意,即使 System.Transactions 可从 COM+ 上下文中找到事务,它仍会首选 System.Transactions 的本机事务。

互操作性级别

EnterpriseServicesInteropOption 枚举定义了下列互操作性级别:NoneFullAutomatic

TransactionScope 类提供的构造函数接受 EnterpriseServicesInteropOption 作为参数。

顾名思义,None 表示 System.EnterpriseServices 上下文与事务范围之间不存在互操作性。在用 None 创建 TransactionScope 对象后,对 Current 的任何更改都不会在 COM+ 上下文中反映出来。同样,对 COM+ 上下文中事务的更改也不会在 Current 中反映出来。这是 System.Transactions 最快速的操作模式,因为不需要任何额外的同步。NoneTransactionScope 对所有不接受 EnterpriseServicesInteropOption 作为参数的构造函数采用的默认值。

如果需要将 System.EnterpriseServices 事务与环境事务组合在一起,则需要使用 FullAutomatic。由于这两个值都依赖于一项无需组件即可调用服务的功能,因此在使用它们时,应在 Windows XP Service Pack 2 或 Windows Server 2003 上运行。

Full 指定 System.TransactionsSystem.EnterpriseServices 的环境事务始终是相同的。这会创建一个新的 System.EnterpriseServices 事务性上下文,并使 TransactionScope 的当前事务成为该上下文的当前事务。因此,Current 中的事务与 Transaction 中的事务完全保持同步。该值会导致性能损失,因为可能会创建新的 COM+ 上下文。

Automatic 指定下列要求:

  • 选中 Current 时,如果 System.Transactions 检测到它没有运行在默认上下文中,则应支持 COM+ 上下文中的事务。请注意,默认上下文不能包含事务。因此,在默认上下文中,即使使用 Automatic,也会对 Current 返回 System.Transactions 所使用的、存储在线程本地存储区中的事务。

  • 如果创建一个新的 TransactionScope 对象,并在默认上下文之外的上下文中执行此操作,则 TransactionScope 对象的当前事务应在 COM+ 中反映出来。在这种情况下,Automatic 的行为与 Full 类似,因为前者会创建新的 COM+ 上下文。

此外,当在 FullAutomatic 中设置了 Current 时,这两种模式都表示不能直接设置 Current。任何直接设置 Current 而不是创建 TransactionScope 的尝试都会导致 InvalidOperationExceptionEnterpriseServicesInteropOption 枚举值由未显式指定要使用哪个值的新事务范围继承。例如,如果用 Full 创建新的 TransactionScope 对象,然后创建另一个 TransactionScope 对象,但不指定 EnterpriseServicesInteropOption 值,则第二个 TransactionScope 对象也具有 Full 值。

总之,在创建新的事务范围时,应遵守下列规则:

  1. 检查 Current 以确定是否存在事务。此检查会执行下列操作:

    • 检查是否存在范围。

    • 如果存在范围,则选中最初创建该范围时传入的 EnterpriseServicesInteropOption 枚举值。

    • 如果将 EnterpriseServicesInteropOption 枚举设置为 Automatic,则 COM+ 事务(System.EnterpriseServices 事务)将优先于托管线程本地存储区中的 System.Transactions 事务。

      如果将该枚举值设置为 None,则托管线程本地存储区中的 System.Transactions 事务将优先。

      如果该枚举值为 Full,则仅存在一个事务,并且该事务是 COM+ 事务。

  2. 检查由 TransactionScope 构造函数传入的 TransactionScopeOption 枚举值。这样可确定是否必须创建新事务。

  3. 如果需要创建新事务,则会生成 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 上下文的事务相同。

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。