该 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 事务与环境事务合并,则需要使用 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,也会对 System.Transactions 返回 Current 所使用的、存储在线程本地存储区中的事务。
如果创建新 TransactionScope 对象并且创建发生在默认上下文以外的上下文中,则对象的当前 TransactionScope 事务应反映在 COM+中。 在这种情况下, Automatic 其行为类似于 Full 创建一个新的 COM+ 上下文。
此外,当Current和Full都设置了Automatic时,这两种模式意味着Current无法直接设置。 任何直接设置 Current 而不是创建 TransactionScope 的尝试都会导致 InvalidOperationException。 EnterpriseServicesInteropOption 枚举值由未显式指定要使用哪个值的新事务范围继承。 例如,如果创建一个新的 TransactionScope 对象并使用 Full,然后创建第二个 TransactionScope 对象但不指定 EnterpriseServicesInteropOption 值,则第二个 TransactionScope 对象也拥有一个 Full。
总之,创建新的事务范围时,以下规则适用:
检查 Current,以查看是否有事务。 此检查结果为:
检查是否存在范围。
如果存在范围,则选中最初创建该范围时传入的 EnterpriseServicesInteropOption 枚举值。
如果将EnterpriseServicesInteropOption枚举设置为Automatic,那么 COM+ 事务(System.EnterpriseServices事务)将优先于托管线程本地存储中的System.Transactions事务。
如果该值设置为 None,则 System.Transactions 托管线程本地存储中的事务优先。
如果值为 Full,则只有一个事务,它是 COM+ 事务。
检查由 TransactionScopeOption 构造函数传入的 TransactionScope 枚举值。 这样可确定是否必须创建新事务。
如果需要创建新事务,则会生成 EnterpriseServicesInteropOption 的下列值:
Full:已创建与 COM+ 上下文关联的事务。
None:已创建 System.Transactions 事务。
Automatic:如果有 COM+ 上下文,则会创建事务并将其附加到上下文。
下表说明了企业服务(ES)上下文,以及需要使用EnterpriseServicesInteropOption枚举的交易范围。
ES 上下文 | 没有 | 自动 | 完全 |
---|---|---|---|
默认上下文 | 默认上下文 | 默认上下文 | 新建 事务上下文 |
非默认上下文 | 保持客户端的上下文 | 创建新的事务上下文 | 创建新的事务上下文 |
下表使用 System.EnterpriseServices 枚举阐释了环境事务(给定特定的 EnterpriseServicesInteropOption 上下文)和需要事务的事务范围。
ES 上下文 | 没有 | 自动 | 完全 |
---|---|---|---|
默认上下文 | 圣 | 圣 | ES(西班牙语) |
非默认上下文 | 圣 | ES(西班牙语) | ES(西班牙语) |
在上表中:
ST 表示范围的环境事务由 System.Transactions 管理,这一点不同于可能存在的任何 System.EnterpriseServices 上下文的事务。
ES 表示作用域的环境事务与 System.EnterpriseServices 上下文的事务相同。