springboot-atomikos多数据源分布式事务
atomikos应用场景:单应用多数据源
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version>
</dependency>
<!-- 这里不使用自动配置,所以不引入starter -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.14</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
修改配置文件
spring:datasource:#使用druid连接池druid:#数据源1的名称one:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.211.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: root#数据源2的名称two:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.211.129:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: root
配置数据源
只需要配置数据源即可,全局事务管理器(JtaTransactionManager)由spring自动配置
@Configuration
public class DataSourceConfig {/*** 创建Druid的XA连接池* @return*/@Bean@ConfigurationProperties("spring.datasource.druid.one")public XADataSource druidXADataSource1(){return new DruidXADataSource();}/*** 创建Atomikos数据源* 注解@DependsOn("druidXADataSource1"),在名为druidXADataSource1的bean实例化后加载当前bean* @param xaDataSource* @return*/@Bean@DependsOn("druidXADataSource1")@Primarypublic DataSource dataSource1(@Qualifier("druidXADataSource1") XADataSource xaDataSource) {//这里的AtomikosDataSourceBean使用的是spring提供的AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean();dataSource.setXaDataSource(xaDataSource);return dataSource;}@Bean@ConfigurationProperties("spring.datasource.druid.two")public XADataSource druidXADataSource2(){return new DruidXADataSource();}@Bean@DependsOn("druidXADataSource2")public DataSource dataSource2(@Qualifier("druidXADataSource2") XADataSource xaDataSource) {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean();dataSource.setXaDataSource(xaDataSource);return dataSource;}
}
配置mybatis
如果使用其他的orm框架,自行配置。
数据源2的mybatis配置和下面代码相似,去除@Primary注解,修改配置属性即可。
@Configuration
//指定扫描的dao包和SqlSession实例
@MapperScan(basePackages = "demo.springboot.atomikos.dao1", sqlSessionTemplateRef = "sessionTemplate1")
public class Mybatis1Config {/*** SqlSessionFactory** @param dataSource* @return* @throws Exception*/@Bean@Primarypublic SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);//mapper文件位置
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml"));return bean.getObject();}/*** SqlSession实例** @param sqlSessionFactory* @return*/@Bean@Primarypublic SqlSessionTemplate sessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}
DAO
public interface UserDAO1 {@Update("update user set name = #{name} where id = #{id}")int updateById(@Param("name")String name, @Param("id")Long id);
}public interface UserDAO2 {@Update("update user set name = #{name} where id = #{id}")int updateById(@Param("name")String name, @Param("id")Long id);
}
service
@Service
public class TestService {@Autowiredprivate UserDAO1 userDAO1;@Autowiredprivate UserDAO2 userDAO2;/*** 在需要事务的方法加上@Transactional注解即可*/@Transactionalpublic void test(){userDAO1.updateById("haha", 1L);userDAO2.updateById("hehe", 2L);//模拟异常int a = 1/0;}
}
测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class AtomikosApplicationTests {@Autowiredprivate TestService testService;@Testpublic void test() {testService.test();}}
数据源1中的User{“id”:1,“name”:“张三”}
数据源2中的User{“id”:2,name:“李四”}
运行测试出现异常后,两个数据库都回滚了,数据未改变
项目路径
作者博客
作者公众号
springboot-atomikos多数据源分布式事务相关推荐
- spring boot+Mybatis+mysql+atomikos+jta实现多数据源分布式事务
spring boot+Mybatis+mysql+atomikos+jta实现多数据源分布式事务 1.导入相关依赖 2.配置相关application.properties 3.创建配置文件 4.创 ...
- springmvc atomikos mysql数据源_Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis...
项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持 ...
- Spring MyBatis Atomikos 实现JTA分布式事务
Spring+MyBatis+Atomikos实现JTA分布式事务 项目中需要同时操作两个数据库,对两个数据库中的表同时做变更时就需要控制事务,要么全部成功,要么全部失败. Atomikos是一个开源 ...
- spring多数据源分布式事务的分析与解决方案
spring多数据源分布式事务的分析与解决方案 参考文章: (1)spring多数据源分布式事务的分析与解决方案 (2)https://www.cnblogs.com/qianjun2017/p/83 ...
- SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))
快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos 特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...
- 【SpringBoot2.0】基于Atomikos的多数据源分布式事务(XA)解决方案
最近工作中在同一项目中用到了多数据源,虽然项目本身对多数据源的事务没有要求,甚至可以不使用事务.但是本着精益求精的原则,加上各种资料的查阅,终于实现了多数据源的XA(分布式事务) 项目框架 sprin ...
- springmvc atomikos mysql数据源_springboot+atomikos+多数据源管理事务(mysql 8.0)
jta:Java Transaction API,即是java中对事务处理的api 即 api即是接口的意思 atomikos:Atomikos TransactionsEssentials 是一个为 ...
- springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起
春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...
- SpringBoot集成jta-atomikos实现分布式事务
1.依赖 <!-- jta-atomikos 分布式事务管理 --> <dependency><groupId>org.springframework.boot&l ...
最新文章
- HTTP长连接服务器端推技术
- 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss
- 优酷在多模态内容理解上的研究及应用
- Linux IO复用:select、poll、epoll的理解与对比
- YII 框架使用之——创建应用
- Qt编译错误“GL/gl.h:No such file or directory”的解决方法
- Mysql 自增主键
- 你妈咪喊你回家刷题~~
- 标准正交表与混合正交表的使用
- 【CSDN】博文导入微信公众号
- 让人喷血的92条个性签名!!!
- pycharm使用问题:鼠标光标变成黑(白)色粗方块
- JAVA 映射HashMap和HashTable的区别和实用
- Flutter(十六)——Hero动画
- 【苹果推信iMessage】群发安装软件sent with Invisible Ink“设置”应用
- centos 防火墙关闭/开启
- base64图片转换file,并上传到阿里云
- linux刷新dns缓存_Linux刷新文件系统缓存
- 2023年十大企业管理软件系统排名
- 第一卷清晨的帝国第一百四十七章希望在人间