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

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

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

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

互操作性级别

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

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

如名称所示,None 意味着 System.EnterpriseServices 上下文和事务范围之间没有互操作性。 在用 TransactionScope 创建 None 对象后,对 Current 的任何更改都不会在 COM+ 上下文中反映出来。 同样,对 COM+ 上下文中事务的更改也不会在 Current 中反映出来。 对于 System.Transactions,这是最快的操作模式,因为没有所需的额外同步。 None 是由具有所有构造函数的 TransactionScope 使用的默认值,这些构造函数不接受 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,也会对 System.Transactions 返回 Current 所使用的、存储在线程本地存储区中的事务。

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

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

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

  1. 检查 Current,以查看是否有事务。 此检查会执行下列操作:

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

  3. 如果需要创建新事务,则会生成 EnterpriseServicesInteropOption 的下列值:

    • Full:已创建与 COM+ 上下文关联的事务。

    • None:已创建 System.Transactions 事务。

    • Automatic:如果存在 COM+ 上下文,则创建事务并附加到此上下文。

下表使用 EnterpriseServicesInteropOption 枚举阐释了企业服务 (ES) 上下文和需要事务的事务范围。

ES 上下文 自动 完全
默认上下文 默认上下文 默认上下文 新建
事务上下文
非默认上下文 保持客户端的上下文 创建新的事务上下文 创建新的事务上下文

下表使用 System.EnterpriseServices 枚举阐释了环境事务(给定特定的 EnterpriseServicesInteropOption 上下文)和需要事务的事务范围。

ES 上下文 自动 完全
默认上下文 ST ST ES
非默认上下文 ST ES ES

在上表中: