与企业服务和 COM+ 事务的互操作性
System.Transactions 命名空间支持使用此命名空间创建的事务对象与通过 COM+ 创建的事务之间的互操作性。
在创建新的 EnterpriseServicesInteropOption 实例时,可以使用 TransactionScope 枚举来指定与 COM+ 的互操作性的级别。
默认情况下,当应用程序代码检查静态 Current 属性时,System.Transactions 会尝试查找当前事务或指示 Current 为 NULL 的 TransactionScope 对象。 如果找不到上述任何一项,则 System.Transactions 会查询事务的 COM+ 上下文。 请注意,即使 System.Transactions 可从 COM+ 上下文中找到事务,它仍会首选 System.Transactions 的本机事务。
互操作性级别
EnterpriseServicesInteropOption 枚举定义了下列互操作性级别:None、Full 和 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+ 上下文,则创建事务并附加到此上下文。
下表使用 EnterpriseServicesInteropOption 枚举阐释了企业服务 (ES) 上下文和需要事务的事务范围。
ES 上下文 | 无 | 自动 | 完全 |
---|---|---|---|
默认上下文 | 默认上下文 | 默认上下文 | 新建 事务上下文 |
非默认上下文 | 保持客户端的上下文 | 创建新的事务上下文 | 创建新的事务上下文 |
下表使用 System.EnterpriseServices 枚举阐释了环境事务(给定特定的 EnterpriseServicesInteropOption 上下文)和需要事务的事务范围。
ES 上下文 | 无 | 自动 | 完全 |
---|---|---|---|
默认上下文 | ST | ST | ES |
非默认上下文 | ST | ES | ES |
在上表中:
ST 表示范围的环境事务由 System.Transactions 管理,这一点不同于可能存在的任何 System.EnterpriseServices 上下文的事务。
ES 表示范围的环境事务与 System.EnterpriseServices 上下文的事务相同。