使用 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 感知的,并参与分布式事务。
您可以直接注入到您的 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 消息。
例如,您的 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 也通过使用 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 暴露,这些 bean 会透明地参与到分布式事务中。
如果您在 ApplicationContext
中注册了 JtaTransactionManager
bean 和适当的 XA 包装器 bean,DataSource 和 JMS 自动配置将使用 JTA 变体。