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。

最后更新于