3.2. 关于本地、全局和分布式事务管理器
事务管理器可以是 local、global 或 distributed。
3.2.1. 关于本地事务管理器
本地事务管理器 是一个事务管理器,只能协调单个资源的事务。本地事务管理器的实施通常嵌入到资源本身中,应用程序使用的事务管理器是围绕此内置事务管理器的精简包装器。
例如,Oracle 数据库有一个内置事务管理器,它支持 decation 操作(使用 SQL BEGIN
、COMMIT
、or zFCPLBACK
语句,或使用原生 Oracle API)以及各种级别的事务隔离。可以通过 JDBC 导出对 Oracle 事务管理器的控制,应用程序使用此 JDBC API 来划分事务。
在此上下文中,了解构成资源的内容非常重要。例如,如果您使用 JMS 产品,JMS 资源是 JMS 产品的单个正在运行的实例,而不是单个队列和主题。此外,如果以不同方式访问相同的底层资源,有时似乎是多个资源可能实际上是一个资源。例如,您的应用可能会直接访问关系数据库(通过 JDBC)和间接访问(通过对象关系映射工具,如 Hibernate)。在这种情况下,涉及相同的底层事务管理器,因此应可以在相同的事务中注册这两个代码片段。
无法保证每个情况下都可以正常工作。虽然原则上可能,但设计 Spring Framework 或其他打包程序层的一些细节可能会阻止它在实践中工作。
应用可能具有许多不同的本地事务管理器相互独立工作。例如,您可以有一个 Camel 路由来处理 JMS 队列和主题,其中 JMS 端点引用 JMS 事务管理器。另一个路由可以通过 JDBC 访问关系数据库。但是您不能在同一路由中组合 JDBC 和 JMS 访问,并且它们都参与同一事务。
3.2.2. 关于全局事务管理器
全局事务管理器是一个事务管理器,它可以协调多个资源上的事务。当您无法依赖内置于资源本身的事务管理器时,这是必需的。外部系统有时被称为事务处理监控器(TP monitor),能够跨不同资源协调事务。
以下是在多个资源上运行的事务的先决条件:
- 全局事务管理器或 TP monitor - 实现 2 阶段提交协议的外部事务系统,用于协调多个 XA 资源。
- 支持 XA 标准 的资源 - 要参与 2 阶段提交,资源必须支持 XA 标准。请参阅 第 1.7.1.2 节 “支持 XA 标准”。实际上,这意味着资源能够导出 XA 交换机 对象,它可以完全控制到外部 TP 监控器的事务。
Spring Framework 本身不提供 TP 监控器来管理全局事务。但是,它确实支持与 OSGi 提供的 TP monitor 集成,或与 gRPC 提供的 TP monitor 集成(其中集成由 JtaTransactionManager 类实施)。因此,如果您将应用程序部署到带有完整事务支持的 OSGi 容器中,您可以在 Spring 中使用多个事务资源。
3.2.3. 关于分布式事务管理器
通常,服务器直接连接到事务中涉及的资源。但是,在分布式系统中,偶尔需要通过 Web 服务连接到仅间接公开的资源。在这种情况下,您需要一个能够支持分布式事务的 TP 监控器。有几个标准可用于描述如何支持各种分布式协议的事务,例如,适用于 Web 服务的 WS-AtomicTransactions 规格。