使用 JTA 的分布式事务

Spring Boot 支持使用从 JNDI 检索的事务管理器,跨多个 XA 资源支持分布式 JTA 事务。

当检测到 JTA 环境时,Spring 的 JtaTransactionManager 用于管理事务。自动配置的 JMS、DataSource 和 JPA Bean 会升级以支持 XA 事务。您可以使用标准的 Spring 惯用语(例如 @Transactional)来参与分布式事务。如果您在 JTA 环境中,但仍想使用本地事务,则可以将 spring.jta.enabled 属性设置为 false 以禁用 JTA 自动配置。

使用 Jakarta EE 管理的事务管理器

如果您将 Spring Boot 应用程序打包为 warear 文件并将其部署到 Jakarta EE 应用程序服务器,则可以使用应用程序服务器内置的事务管理器。Spring Boot 会通过查看常见的 JNDI 位置(java:comp/UserTransactionjava:comp/TransactionManager 等)来尝试自动配置事务管理器。在使用应用程序服务器提供的交易服务时,您通常还希望确保所有资源都由服务器管理并通过 JNDI 公开。Spring Boot 会通过在 JNDI 路径(java:/JmsXAjava:/XAConnectionFactory)中查找 ConnectionFactory 来尝试自动配置 JMS,您可以使用 spring.datasource.jndi-name 属性 来配置您的 DataSource

混合使用 XA 和非 XA JMS 连接

使用 JTA 时,主 JMS ConnectionFactory Bean 是 XA 感知的,并参与分布式事务。您可以在不使用任何 @Qualifier 的情况下将其注入到您的 Bean 中

  • Java

  • Kotlin

	public MyBean(ConnectionFactory connectionFactory) {
		// ...
	}

在某些情况下,您可能希望使用非 XA ConnectionFactory 处理某些 JMS 消息。例如,您的 JMS 处理逻辑可能比 XA 超时时间长。

如果您想使用非 XA ConnectionFactory,可以使用 nonXaJmsConnectionFactory Bean

  • Java

  • Kotlin

	public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
		// ...
	}

为了保持一致性,jmsConnectionFactory Bean 也通过 Bean 别名 xaJmsConnectionFactory 提供

  • Java

  • Kotlin

	public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
		// ...
	}

支持嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper 接口可用于支持嵌入式事务管理器。这些接口负责包装 XAConnectionFactoryXADataSource Bean,并将它们公开为常规的 ConnectionFactoryDataSource Bean,这些 Bean 会透明地注册到分布式事务中。只要您有 JtaTransactionManager Bean 和在 ApplicationContext 中注册的适当 XA 包装器 Bean,DataSource 和 JMS 自动配置就会使用 JTA 变体。