> For the complete documentation index, see [llms.txt](https://doc.shiker.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.shiker.tech/spring-boot-can-kao-wen-dang/11.-io/11.8.-shi-yong-jta-jin-xing-fen-bu-shi-shi-wu.md).

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

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

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

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

如果将 Spring Boot 应用程序打包为`war`或`ear`文件并将其部署到 Jakarta EE 应用程序服务器，则可以使用应用程序服务器的内置事务管理器。Spring Boot 尝试通过查看常见的 JNDI 位置（`java:comp/UserTransaction` 、 `java:comp/TransactionManager`等）来自动配置事务管理器。当使用应用程序服务器提供的事务服务时，您通常还希望确保所有资源都由服务器管理并通过 JNDI 公开。`ConnectionFactory`Spring Boot 尝试通过在 JNDI 路径（`java:/JmsXA`或`java:/XAConnectionFactory`）中查找来自动配置 JMS ，并且您可以使用[`spring.datasource.jndi-name`属性](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#data.sql.datasource.jndi)来配置您的`DataSource`.

**11.8.2. 混合 XA 和非 XA JMS 连接**

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

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

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

如果你想使用非 XA `ConnectionFactory`，你可以使用`nonXaJmsConnectionFactory`bean：

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

为了保持一致性，`jmsConnectionFactory`还使用 bean 别`xaJmsConnectionFactory`名来提供 bean ：

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

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

[`XAConnectionFactoryWrapper`](https://github.com/spring-projects/spring-boot/tree/v3.2.0/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jms/XAConnectionFactoryWrapper.java)和[`XADataSourceWrapper`](https://github.com/spring-projects/spring-boot/tree/v3.2.0/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/XADataSourceWrapper.java)接口可用于支持嵌入式事务管理器。这些接口负责包装`XAConnectionFactory`和`XADataSource`Bean并将它们公开为常规`ConnectionFactory` 和`DataSource`Bean ，从而透明地注册到分布式事务中。DataSource 和 JMS 自动配置使用 JTA 变体，前提是您在 `ApplicationContext`中注册了`JtaTransactionManager` bean 和适当的 XA 包装器 bean。
