# 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。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
