多数据源解决分布式事务
创始人
2024-04-23 04:18:17
0

 环境:idea+springboot2.x

场景:调用addUser方法执行对两个数据库的表操作,如果方法出现异常就回滚

 

 

user数据库中的users表

 

order数据库中的order_number表

 

将各自的事务管理器改为统一事务管理器即可

第一步pom文件配置jta atomikos 依赖

  org.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter2.2.2mysqlmysql-connector-java5.1.47org.projectlomboklombokorg.projectlomboklombok1.16.10org.springframework.bootspring-boot-starter-jta-atomikos

第二步yml配置

spring:datasource:member:url: jdbc:mysql://localhost:3306/user?useSSL=falseusername: rootpassword: rootboorowConectionTimeout: 30loginTimeout: 30maintenanceInterval: 60maxIdleTime: 60maxLifetime: 20000maxPoolSize: 25minPoolSize: 3uniqueResourceName: orderDatasourceorder:url: jdbc:mysql://localhost:3306/order?useSSL=falseusername: rootpassword: rootborrowConnectionTimeout: 30loginTimeout: 30maintenanceInterval: 60maxIdleTime: 60maxLifetime: 20000maxPoolSize: 25minPoolSize: 3uniqueResourceName: memberDatasource

第三步配置编写MemberConfig和OrdeerConfig配置类

@Data
@ConfigurationProperties(prefix = "spring.datasource.member")
public class MemberConfig {private String url;private String userName;private String passWord;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;private String uniqueResourceName;
}
@Data
@ConfigurationProperties(prefix = "spring.datasource.order")
public class OrderConfig {private String url;private String userName;private String passWord;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;private String uniqueResourceName;
}

第五步将DataSource改为xaDataSource

以MemberDataSourceConfig为例,OrderDataSourceConfig操作步骤相同

/*** 创建DataSource 将我们的数据源统一交给我们的全局xa事务管理* @return*/
@Bean(name = "memberDataSource")
public DataSource memberDataSource(MemberConfig memberConfig) throws SQLException {// 1.创建我们的xaDataSourceMysqlXADataSource mysqlXADataSource = new MysqlXADataSource();mysqlXADataSource.setUrl(memberConfig.getUrl());mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXADataSource.setPassword(memberConfig.getPassWord());mysqlXADataSource.setUser(memberConfig.getUserName());mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);// 2.注册到全局事务AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXADataSource);xaDataSource.setUniqueResourceName(memberConfig.getUniqueResourceName());xaDataSource.setMinPoolSize(memberConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(memberConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(memberConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(memberConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(memberConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(memberConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(memberConfig.getMaxIdleTime());xaDataSource.setTestQuery(memberConfig.getTestQuery());//        return DataSourceBuilder.create().build(); // 原始的DataSourcereturn xaDataSource; // 改为xaDataSource
}

第六步关闭事务管理器

 以MemberDataSourceConfig为例,OrderDataSourceConfig操作步骤相同

 

执行代码

 

 

 此时表中数据(已刷新)

 放行

 此时表中数据(已刷新)

 事务回滚

 

输入合法数据进行测试

 直接放行

数据已加入

 页面信息

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...