局部事务包含范围
IBM® WebSphere® Application Server 支持局部事务容器 (LTC),可使用局部事务扩展部署描述符来配置局部事务容器。LTC 支持为应用程序员带来了某些优势。使用所提供的方案和要考虑的要点列表来帮助您选择为局部事务配置事务支持的最佳实践。
下列各部分描述 LTC 支持提供的优点以及如何在每种情况下设置局部事务扩展部署描述符。
- 可以开发访问独立的并且不需要协调的一个或多个数据库的企业 bean 或 servlet。
- 如果企业 bean 不必使用全局事务,那么用部署描述符来为容器事务(其类型设置为 NotSupported 而不是 Required)部署 bean 通常更有效。
借助应用程序服务器的扩展局部事务支持,应用程序可以在非特定的事务上下文中执行与在全局事务中可以执行的业务逻辑。例如,如果用类型为 NotSupported 或 Never 的容器事务来部署企业 Bean,那么该企业 bean 在非特定事务上下文中运行。
扩展的局部事务支持提供容器管理的隐式局部事务约束边界,在其中容器可以落实应用程序更新以及清除它们的连接。设计应用程序时可以少考虑一些部署问题。这让使用类型为 Supports 的容器事务变得更简单,例如,不论是否使用全局事务上下文,均可调用业务逻辑。
应用程序可以按照获取-使用-关闭这一连接使用模式,而不论应用程序是否在事务中运行。应用程序可依赖于关闭操作在所有情况下均起到相同作用这一情况,即,即使没有全局事务,关闭操作也不会导致连接发生回滚。
有很多不需要多个资源管理器的 ACID 协调的方案。对于此类方案,在 NotSupported 事务策略下运行业务逻辑比在 Required 策略下运行要好。通过在“局部事务”部分中将“解析器”属性的部署描述符设置为 ContainerAtBoundary 来应用此优点。借助此设置,应用程序与资源提供程序(例如数据库)的交互均在由容器启动和结束的隐式资源管理器局部事务 (RMLT) 中管理。容器在由“局部事务”部分中的“边界”属性所指定的容器边界上落实 RMLT;例如,在方法的结尾处。如果应用程序由于异常而将控制返回给容器,那么容器回滚任何它启动的 RMLT。
该用法适用于 Servlet 和企业 Bean。
- 可以在保证清除的受管环境中使用局部事务。
- 需要通过启动和结束 RMLT 来控制 RMLT 的应用程序可以使用“局部事务”部分中“解析器”扩展部署描述符的缺省设置 Application。在这种情况下,容器确保清除局部事务上下文边界上的连接。
Java™ 平台企业应用程序规范描述了局部事务的应用程序使用,具体为如何根据“局部事务”部分中“解析器应用程序”扩展部署描述符和“未解析的回滚”操作扩展部署描述符缺省设置所提供的方式来实现操作。如果“局部事务”部分中的“操作无法解析”扩展部署描述符被设置为 Commit,那么当局部事务容器结束时(例如,方法结束时),容器将落实由应用程序启动但未完成的任何 RMLT。该用法适用于 Servlet 和企业 Bean。
可以扩展局部事务的持续时间以使它超过 EJB 组件方法的持续时间。
Enterprise JavaBeans (EJB) 规范将 RMLT 的使用限制为单一的 EJB 方法。此限制是由于规范对于超出可以将 RMLT 扩展到的利用容器的方法边界没有作用域限定设备。可使用“局部事务”部分中的“边界”扩展部署设置来提供以下优点:
- 显著扩展了 RMLT 的使用场合。
- 可以通过 ActivitySession 支持与一阶段资源管理器进行会话式交互。
您可以使用 ActivitySession 向分布式上下文提供比单个方法更长的边界。可在更长的 ActivitySession 边界(可由客户机控制)上使用 RMLT。ActivitySession 边界减少在不需要多个资源上的 ACID 操作的情况下使用分布式事务的需要。通过“局部事务”部分中 ActivitySession 的“边界”扩展部署设置来应用此优点。这样的扩展 RMLT 可保留为由应用程序控制,也可以由容器管理,取决于“局部事务”部分中“解析器”部署描述符的设置。
- 可以协调多个一阶段资源管理器。
- 对于不支持 XA 事务协调的资源管理器,客户机可以使用 ActivitySession 界定的局部事务上下文。这样的上下文向客户机提供控制资源管理器作出的资源更新的完全方向的能力,该能力与客户机向事务资源管理器提供的能力是相同的。客户机可以启动 ActivitySession 并在该上下文中调用它的实体 bean。那些 bean 可以在该 ActivitySession 的作用域中执行它们的 RMLT 并且在 RMLT 未完成的情况下返回。随后,客户机可以在落实或回滚方向中完成 ActivitySession,并且致使容器以该坐标方向驱动 ActivitySession 界定的 RMLT。
- 可以使用可共享的 LTC 来减少所需的连接数。
- 应用程序组件可以共享 LTC。如果多个组件获取了与同一资源管理器的连接,并且这些组件在同一全局事务或可共享的 LTC 下运行,那么它们可以共享该连接。要将两个组件配置为在同一可共享的 LTC 下运行,请在每个组件的部署描述符中设置“局部事务”部分的“可共享”属性。确保每个组件部署描述符中的资源引用使用 res-sharing-scope 元素的“可共享”缺省值(如果指定了此元素)。可共享的 LTC 可以减少应用程序使用的 RMLT 的数量。 例如,频繁使用包含调用的 Web 模块的应用程序可以共享这些 Web 模块之间的资源管理器连接,同时可以利用可共享的 LTC 或全局事务,减少资源的锁争用。
局部事务支持配置的示例
以下列表提供了使用局部事务的一些方案以及在决定为应用程序配置事务支持的最佳实践时要考虑的要点。
- 您要在应用程序中显式地启动和结果全局事务(仅 bean 管理的事务会话 bean 和 servlet)。
对于会话 bean,请在组件的部署描述符中将“事务类型”设置为 bean(以使用 bean 管理的事务)。不必对 Servelt 执行此操作。
您只要访问一个方法中的一个 XA 或非 XA 资源。
在组件部署描述符的“局部事务”部分中,将“解析器”属性设置为 ContainerAtBoundary。在“容器事务”部分中,将容器事务类型设置为 Supports。
- 您要自动跨越一个或多个 bean 方法访问若干 XA 资源。
在组件部署描述符的“容器事务”部分中,将容器事务类型设置为 Required、RequiresNew 或 Mandatory。
您要访问一个方法中的若干非 XA 资源,并且不需要管理您自已的局部事务。
在组件部署描述符的“局部事务”部分中,将“解析器”属性设置为 ContainerAtBoundary。在“容器事务”部分中,将容器事务类型设置为 NotSupported。
- 您要访问一个方法中的若干非 XA 资源并且要独立地管理它们。
在组件部署描述符的“局部事务”部分中,将“解析器”属性设置为 Application 并将“操作无法解析”属性设置为 Rollback。在“容器事务”部分中,将容器事务类型设置为 NotSupported。
您要跨越多个 EJB 方法调用访问一个或多个非 XA 资源,并且不需要管理您自已的局部事务。
在组件部署描述符的“局部事务”部分中,将“解析器”属性设置为 ContainerAtBoundary 并将“边界”属性设置为 ActivitySession。在“bean 高速缓存”部分中,将“激活于”属性设置为 ActivitySession。在“容器事务”部分中,将容器事务类型设置为 NotSupported 并将“ActivitySession 种类”属性设置为 Required、RequiresNew 或 Mandatory。
您要跨越多个 EJB 方法调用访问若干非 XA 资源,并且要独立地管理它们。
在组件部署描述符的“局部事务”部分中,将“解析器”属性设置为 Application 并将“边界”属性设置为 ActivitySession。在“Bean 高速缓存”部分中,将“激活于”属性设置为 ActivitySession。在“容器事务”部分中,将容器事务类型设置为 NotSupported 并将“ActivitySession 种类”属性设置为 Required、RequiresNew 或 Mandatory。
您要使用非 XA 资源以及多个两阶段 RRS 资源。
只要全局事务是活动的,就支持事务中的非 XA 资源以及 RRS 资源。如果容器事务类型的部署描述符设置为 Supports、Required、RequiresNew 或 Mandatory,那么全局事务是活动的。对于组件管理的部署,全局事务也是活动的。容器管理 非 XA 资源局部事务连同 RRS 资源的完成。