Spring Boot对分布式JTA事务的支持

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 应用程序打包为 warear文件并将其部署到 Jakarta EE 应用服务器上,可以使用应用服务器内置的事务管理器。Spring Boot 会尝试通过查看常见的 JNDI 位置(例如 java:comp/UserTransactionjava:comp/TransactionManager 等)来自动配置事务管理器。当使用应用服务器提供的事务服务时,通常还需要确保所有资源都由服务器管理并通过 JNDI 公开。Spring Boot 会尝试通过查找位于 JNDI 路径(java:/JmsXAjava:/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) {
    // ...
}

支持嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper 接口可用于支持嵌入式事务管理器。这些接口负责包装 XAConnectionFactoryXADataSource bean,并将它们作为常规的 ConnectionFactoryDataSource bean 暴露出来,这些 bean 可以透明地参与分布式事务。只要你在 ApplicationContext 中注册了 JtaTransactionManager bean 和适当的 XA 包装器 bean,DataSource 和 JMS 自动配置就会使用 JTA 变体。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boot分布式事务的解决方案是JTA,即Java Transaction API。Spring Boot官方提供了Atomikos的解决思路。在项目中引入Atomikos的依赖,然后在配置文件中配置数据源和事务管理器即可实现分布式事务。具体步骤如下: 1.在pom.xml文件中引入Atomikos的依赖: ```xml <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <version>4.0.6</version> </dependency> ``` 2.在application.properties文件中配置数据源和事务管理器: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jta.atomikos.datasource.ds1.unique-resource-name=ds1 spring.jta.atomikos.datasource.ds1.xa-data-source-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource spring.jta.atomikos.datasource.ds1.xa-properties.url=jdbc:mysql://localhost:3306/test spring.jta.atomikos.datasource.ds1.xa-properties.user=root spring.jta.atomikos.datasource.ds1.xa-properties.password=root spring.jta.atomikos.transaction-manager-id=tm ``` 3.在代码中使用@Transactional注解开启事务: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Transactional @Override public void transfer(int fromUserId, int toUserId, double amount) { userDao.decreaseBalance(fromUserId, amount); userDao.increaseBalance(toUserId, amount); } } ``` 以上就是Spring Boot分布式事务的解决方案。需要注意的是,使用JTA需要在应用服务器中配置JTA事务管理器,例如Tomcat需要配置Bitronix或Atomikos。同时,JTA也有一些缺点,例如性能较差,配置较为复杂等。因此,在实际项目中需要根据具体情况选择合适的事务解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值