https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#io.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
)的 ConnectionFactory
来自动配置 JMS,可以使用 spring.datasource.jndi-name
属性来配置你的 DataSource
。
混合使用XA和非XA JMS连接
在使用JTA时,主要的JMS ConnectionFactory
bean是能够感知到XA的,并且可以参与分布式事务。可以在不使用任何@Qualifier
注解的情况下将其注入到你的bean中:
public MyBean(ConnectionFactory connectionFactory) {
// ...
}
在某些情况下,你可能希望使用非XA ConnectionFactory
来处理某些JMS消息。例如,你的JMS处理逻辑可能会超过XA超时时间。
如果想使用非XA ConnectionFactory
,可以注入nonXaJmsConnectionFactory
bean:
public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
为了保持一致性,jmsConnectionFactory
bean 也通过别名 xaJmsConnectionFactory
提供:
public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
支持嵌入式事务管理器
XAConnectionFactoryWrapper
和 XADataSourceWrapper
接口可用于支持嵌入式事务管理器。这些接口负责包装 XAConnectionFactory
和 XADataSource
bean,并将它们作为常规的 ConnectionFactory
和 DataSource
bean 暴露出来,这些 bean 可以透明地参与分布式事务。只要你在 ApplicationContext
中注册了 JtaTransactionManager
bean 和适当的 XA 包装器 bean,DataSource
和 JMS 自动配置就会使用 JTA 变体。