For the complete documentation index, see llms.txt. This page is also available as Markdown.

11.8. 使用 JTA 进行分布式事务

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

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

11.8.1. 使用 Jakarta EE 托管事务管理器

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

11.8.2. 混合 XA 和非 XA JMS 连接

使用 JTA 时,主 JMS ConnectionFactorybean 是 XA 感知的并参与分布式事务。您可以注入到您的 bean 中,无需使用任何@Qualifier

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

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

如果你想使用非 XA ConnectionFactory,你可以使用nonXaJmsConnectionFactorybean:

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

为了保持一致性,jmsConnectionFactory还使用 bean 别xaJmsConnectionFactory名来提供 bean :

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

11.8.3. 支持嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper接口可用于支持嵌入式事务管理器。这些接口负责包装XAConnectionFactoryXADataSourceBean并将它们公开为常规ConnectionFactoryDataSourceBean ,从而透明地注册到分布式事务中。DataSource 和 JMS 自动配置使用 JTA 变体,前提是您在 ApplicationContext中注册了JtaTransactionManager bean 和适当的 XA 包装器 bean。

最后更新于