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多数据源分布式事务相关推荐

  1. spring boot+Mybatis+mysql+atomikos+jta实现多数据源分布式事务

    spring boot+Mybatis+mysql+atomikos+jta实现多数据源分布式事务 1.导入相关依赖 2.配置相关application.properties 3.创建配置文件 4.创 ...

  2. springmvc atomikos mysql数据源_Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis...

    项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持 ...

  3. Spring MyBatis Atomikos 实现JTA分布式事务

    Spring+MyBatis+Atomikos实现JTA分布式事务 项目中需要同时操作两个数据库,对两个数据库中的表同时做变更时就需要控制事务,要么全部成功,要么全部失败. Atomikos是一个开源 ...

  4. spring多数据源分布式事务的分析与解决方案

    spring多数据源分布式事务的分析与解决方案 参考文章: (1)spring多数据源分布式事务的分析与解决方案 (2)https://www.cnblogs.com/qianjun2017/p/83 ...

  5. SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))

    快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos  特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...

  6. 【SpringBoot2.0】基于Atomikos的多数据源分布式事务(XA)解决方案

    最近工作中在同一项目中用到了多数据源,虽然项目本身对多数据源的事务没有要求,甚至可以不使用事务.但是本着精益求精的原则,加上各种资料的查阅,终于实现了多数据源的XA(分布式事务) 项目框架 sprin ...

  7. springmvc atomikos mysql数据源_springboot+atomikos+多数据源管理事务(mysql 8.0)

    jta:Java Transaction API,即是java中对事务处理的api 即 api即是接口的意思 atomikos:Atomikos TransactionsEssentials 是一个为 ...

  8. springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起

    春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...

  9. SpringBoot集成jta-atomikos实现分布式事务

    1.依赖 <!-- jta-atomikos 分布式事务管理 --> <dependency><groupId>org.springframework.boot&l ...

最新文章

  1. HTTP长连接服务器端推技术
  2. 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss
  3. 优酷在多模态内容理解上的研究及应用
  4. Linux IO复用:select、poll、epoll的理解与对比
  5. YII 框架使用之——创建应用
  6. Qt编译错误“GL/gl.h:No such file or directory”的解决方法
  7. Mysql 自增主键
  8. 你妈咪喊你回家刷题~~
  9. 标准正交表与混合正交表的使用
  10. 【CSDN】博文导入微信公众号
  11. 让人喷血的92条个性签名!!!
  12. pycharm使用问题:鼠标光标变成黑(白)色粗方块
  13. JAVA 映射HashMap和HashTable的区别和实用
  14. Flutter(十六)——Hero动画
  15. 【苹果推信iMessage】群发安装软件sent with Invisible Ink“设置”应用
  16. centos 防火墙关闭/开启
  17. base64图片转换file,并上传到阿里云
  18. linux刷新dns缓存_Linux刷新文件系统缓存
  19. 2023年十大企业管理软件系统排名
  20. 第一卷清晨的帝国第一百四十七章希望在人间

热门文章

  1. JS原型应用-面试题
  2. 如何在 JavaScript 循环中使用 async/await
  3. The free SSH client for Android 之JuiceSSH神器
  4. 2023-2028年中国化妆棉行业市场需求与投资规划分析报告
  5. 一张能分出你是左脑还是右脑的经典图片
  6. salt学习-grains
  7. Python第四周作业之选择题
  8. java中nextInt()用法
  9. 知识图谱——用Python代码从文本中挖掘信息的强大数据科学技术
  10. 电脑开机后进不了系统?原因以及解决方法