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

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

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

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

互作性级别

枚举EnterpriseServicesInteropOption定义了以下级别的互作性,NoneFull以及 Automatic

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+ 上下文,则会创建事务并将其附加到上下文。

下表说明了企业服务(ES)上下文,以及需要使用EnterpriseServicesInteropOption枚举的交易范围。

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

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

ES 上下文 没有 自动 完全
默认上下文 ES(西班牙语)
非默认上下文 ES(西班牙语) ES(西班牙语)

在上表中: