分布式事务(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 应用打包为 war
或 ear
文件并部署到 Jakarta EE 应用服务器,可以使用应用服务器内置的事务管理器。
Spring Boot 会尝试通过常见的 JNDI 路径(如 java:comp/UserTransaction
、java:comp/TransactionManager
等)自动配置事务管理器。
使用应用服务器提供的事务服务时,通常还需确保所有资源由服务器管理并通过 JNDI 暴露。
Spring Boot 会尝试通过 JNDI 路径(如 java:/JmsXA
或 java:/XAConnectionFactory
)自动配置 JMS,你也可以通过 spring.datasource.jndi-name
属性 配置 DataSource
。
混用 XA 与非 XA JMS 连接
使用 JTA 时,主 JMS ConnectionFactory
bean 具备 XA 能力并参与分布式事务。
你可以直接注入该 bean,无需使用 @Qualifier
:
-
Java
-
Kotlin
import jakarta.jms.ConnectionFactory;
public class MyBean {
public MyBean(ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
class MyBean(connectionFactory: ConnectionFactory?)
在某些场景下,你可能希望通过非 XA 的 ConnectionFactory
处理部分 JMS 消息,例如处理逻辑超出 XA 超时时间。
如需使用非 XA 的 ConnectionFactory
,可注入 nonXaJmsConnectionFactory
bean:
-
Java
-
Kotlin
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("nonXaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
为保持一致性,还提供了 jmsConnectionFactory
bean 的别名 xaJmsConnectionFactory
:
-
Java
-
Kotlin
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("xaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
支持嵌入式事务管理器
XAConnectionFactoryWrapper
和 XADataSourceWrapper
接口可用于支持嵌入式事务管理器。
这些接口负责包装 XAConnectionFactory
和 XADataSource
bean,并将其暴露为常规的 ConnectionFactory
和 DataSource
bean,从而透明地参与分布式事务。
只要你的 ApplicationContext
中注册了 JtaTransactionManager
bean 及相应的 XA 包装 bean,DataSource 和 JMS 自动配置就会使用 JTA 变体。