(附源码gitHub下载地址)spring boot -jta-atomikos分布式事务

       应用场景:双数据源,就是某些项目会涉及到两个数据源或者两个以上的数据源,这个多数据源的项目一般是数据同步,也就是把数据从另一个系统中,保存到另一个系统,两边的 数据库又不一样,比如一个Mysql、一个Sql Server。但是不管是什么类型的数据库,我们都不管,直接连接就是。

      为什么要使用分布式事务:顾名思义,事务就是回滚,比如如果一个在保存数据的时候,在A数据库已经 保存,但是在保存数据在B的过程抛出异常,那么是不是应该全部回滚,把已经 保存了的A、B数据库的数据全部回滚?答案是确定的。下面就解说:

 

           pom.xml主要依赖:

 

       <dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency>

  

          properties配置文件:

 

         #数据源一
spring.datasource.primary.url=jdbc:mysql://localhost:3306/testspring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.primary.xa-data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource
#数据源二spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test1spring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.xa-data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource

 

         数据源的配置类:DataSourceConfig.class

        

import com.alibaba.druid.pool.xa.DruidXADataSource;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class DataSourceConfig {//这里一定要加主数据源的注解@Primary@Bean(name = "primaryProperty")@ConfigurationProperties(prefix = "spring.datasource.primary")public DruidXADataSource primaryDataSource() {return new DruidXADataSource();}
//这里是第二个数据源@Bean(name = "secondaryProperty")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DruidXADataSource secondaryDataSource() {return new DruidXADataSource();} }

  

     再分别配置他们的数据源:以便包扫描、事务交给jta-atomikos统一管理   

    主数据源配置类:

import com.alibaba.druid.pool.xa.DruidXADataSource;
import com.atomikos.jdbc.AtomikosDataSourceBean;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import tk.mybatis.spring.annotation.MapperScan;@Configuration
@MapperScan(basePackages = {"com.example.dao.primary"}, sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDBConfig {@Bean(name = "primaryDataSource")public DataSource dataSourceCar(@Qualifier("primaryProperty") DruidXADataSource druidXADataSource) {AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(druidXADataSource);xaDataSource.setUniqueResourceName("primaryDataSource");return xaDataSource;}@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/*Mapper.xml"));//扫描指定目录的xmlreturn bean.getObject();}@Bean(name = "primarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

  

       同理,第二个数据源的配置SecondaryDBConfig.java

@Configuration
@MapperScan(basePackages = {"com.example.dao.secondary"}, sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDBConfig {@Bean(name = "secondaryDataSource")public DataSource dataSourceCar(@Qualifier("secondaryProperty") DruidXADataSource druidXADataSource) {AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(druidXADataSource);xaDataSource.setUniqueResourceName("secondaryDataSource");return xaDataSource;}@Bean(name = "secondarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*Mapper.xml"));//扫描指定目录的xmlreturn bean.getObject();}@Bean(name = "secondarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

  

最后我们还需要配置事务管理的配置类:TransactionManagerConfig.java,以便把数据源一,数据源二全部交给jta-atomikos管理,实现分布式事务管理:

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;@Configuration
public class TransactionManagerConfig {@Bean(name = "userTransaction")public UserTransaction userTransaction() throws Throwable {UserTransactionImp userTransactionImp = new UserTransactionImp();userTransactionImp.setTransactionTimeout(10000);return userTransactionImp;}@Bean(name = "atomikosTransactionManager")public TransactionManager atomikosTransactionManager() throws Throwable {UserTransactionManager userTransactionManager = new UserTransactionManager();userTransactionManager.setForceShutdown(false);return userTransactionManager;}@Bean(name = "transactionManager")@DependsOn({ "userTransaction", "atomikosTransactionManager" })public PlatformTransactionManager transactionManager() throws Throwable {return new JtaTransactionManager(userTransaction(),atomikosTransactionManager());}
}

  最后我们在service类上加上注解:@Transactional(value = "transactionManager", rollbackFor = Exception.class)

当value = "transactionManager",则是分布式事务的管理。至此,全部完成。

gitHub完整项目下载地址:https://gitee.com/qhThomas/springboot-mybatis-duria.git

 

转载于:https://www.cnblogs.com/qq1141100952com/p/11548257.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华刘知远:大模型「十问」,寻找新范式下的研究方向

来源&#xff1a;智源社区作者&#xff1a;刘知远整理&#xff1a;李梦佳大模型的出现迎来了AI研究的新时代&#xff0c;其所带来的结果提升十分显著&#xff0c;超越了很多领域中针对研究问题设计特定算法实现的提升。具体而言&#xff0c;预训练到Finetune的新范式最本质的特…

Django - ORM操作

Django - ORM操作 一. 必知必会13条 单表查询之神奇的双下划线二. ForeignKey操作 正向查找反向操作三. ManyToManyField四. 聚合查询和分组查询 聚合分组五. F查询和Q查询 F查询Q查询六. 锁和事务 锁事务七. Django ORM执行原生SQL 执行原生查询直接执行自定义SQLDjango - ORM…

从王者荣耀AI看人工智能与游戏结合的未来意义

来源&#xff1a;央广网国际在线消息&#xff1a;3月18日&#xff0c;成都大运会倒计时100天之际&#xff0c;由大运会执委会主办&#xff0c;腾讯承办的“世界大学生数智竞技邀请赛”正式启动。这次邀请赛将融合科技、文化、竞技的赛场精神&#xff0c;以《王者荣耀》和腾讯AI…

String源码分析

最近开始阅读java底层的源码&#xff0c;是因为发现越到后面越发现读源码的重要性&#xff0c;真的很重要&#xff0c;不阅读源码&#xff0c;你会发现“路”越走越窄。 今天看到了String的这个构造方法&#xff0c; /*** Initializes a newly created {code String} object so…

575万奖金!2022年数学界「诺贝尔奖」发布,拓扑学大师获奖

来源&#xff1a;AI科技评论作者&#xff1a;西西编辑&#xff1a;陈彩娴3月22日晚&#xff0c;被誉为数学界「诺贝尔奖」的阿贝尔奖揭晓。2022年&#xff0c;挪威科学院决定将阿贝尔奖授予来自美国纽约市立大学研究生院的阿尔伯特爱因斯坦讲座教授、纽约州立大学石溪分校的教授…

spring cloud eureka注册原理-注册失败填坑

写在前面 我们知道Eureka分为两部分&#xff0c;Eureka Server和Eureka Client。Eureka Server充当注册中心的角色&#xff0c;Eureka Client相对于Eureka Server来说是客户端&#xff0c;需要将自身信息注册到注册中心。本文主要介绍的就是在Eureka Client注册到Eureka Server…

为什么深度学习是非参数的?

来源&#xff1a;AI科技评论作者&#xff1a;Thomas Viehmann编译&#xff1a;钱磊编辑&#xff1a;陈彩娴今天我想要与大家分享的是深度神经网络的工作方式&#xff0c;以及深度神经与“传统”机器学习模型的不同之处。我的计划具体如下&#xff1a;首先简单地思考一下如何将问…

看视频

转载于:https://www.cnblogs.com/wlphp/p/11569819.html

“一束光”让机器人也能拥有触觉?之江实验室这项技术惊艳世界

来源&#xff1a;浙江日报传递触觉的“特殊道路”我们对这个世界最初的感知通常是从触觉开始的——第一声啼哭之前&#xff0c;婴儿经历过诱发哭声的拍打&#xff1b;成长中提笔、拍球&#xff1b;生活中握手&#xff0c;敲击键盘&#xff0c;使用手机……触觉充斥着我们日常生…

图书管理系统~简单流程

1. 连接数据库 2. 路由url (网站目录) 2.1若要从URL 中捕获一个值&#xff0c;只需要在它周围放置一对圆括号。&#xff08;分组&#xff09;2.2使用简单的、没有命名的正则表达式组&#xff08;通过圆括号&#xff09;来捕获URL中的值并以位置 参数传递给视图。在更高级的用法…

7年前轰动全球的Science论文,被发现可能搞错了

来源&#xff1a;iNature蛇是一个非常多样化和成功的群体&#xff0c;但它们的进化起源是模糊的。两条腿蛇的发现揭示了从蜥蜴到蛇的过渡&#xff0c;但没有描述过四条腿蛇&#xff0c;早期蛇的生态知之甚少。2015年7月24日&#xff0c;英国朴茨茅斯大学David M. Martill等人在…

Django - AJAX

一. JSON 什么是json? json指的是JavaScript对象表示法(JavaScript Object Notation)json是轻量级的文本数据交换格式独立于语言, 支持不同的编程语言具有自我描述性, 跟易理解合格的json对象: ["one", "two", "three"] { "one": 1, …

培育强人工智能的「ImageNet」:上海交大卢策吾组提出铰接物体知识库 AKB-48

来源&#xff1a;前沿科技编译&#xff1a;OGAI编辑&#xff1a;陈彩娴ImageNet 的出现极大推动了计算机视觉领域的发展。在通往强人工智能的路上&#xff0c;我们还需要考虑物体的外观、结构、物理性质、语义等因素。为此&#xff0c;上海交大卢策吾组近日重磅推出了大型真实世…

java运行字符串代码

本文链接&#xff1a;https://blog.csdn.net/junlong750/article/details/50945883转载于:https://www.cnblogs.com/bevis-byf/p/11578724.html

模块化认知:演化如何自下而上涌现出智能?

来源&#xff1a; 集智俱乐部作者&#xff1a;Michael Levin, Rafael Yuste译者&#xff1a;郭瑞东审校&#xff1a;刘志航、梁金 编辑&#xff1a;邓一雪 导语无论是聪明的人、哺乳动物、鸟类&#xff0c;还是细胞和组织、神经元网络、病毒以及蛋白质分子&#xff0c;在所有尺…

yum 多线程插件,apt多线程插件

1.安装yum-axelget插件&#xff0c;默认 yum使用单线程下载&#xff0c;安装该插件后&#xff0c;会使用多线程下载。 yum -y install yum-axelget 2. apt-fast安装 https://github.com/ilikenwf/apt-fast 转载于:https://www.cnblogs.com/wangshuyi/p/11580310.html

Stuart Russell:智能本质和人工智能安全的巨大挑战

斯图尔特罗素&#xff08;Stuart Russell&#xff09;&#xff0c;加州大学伯克利分校计算机科学专业教授&#xff0c;著有人工智能领域“标准教科书”——《人工智能&#xff1a;一种现代化方法》&#xff08;与谷歌研究主管Peter Norvig合著&#xff09;来源&#xff1a;智能…

左耳听风

《程序员练级攻略》系列文章的目录。 开篇词入门篇 零基础启蒙正式入门修养篇 程序员修养专业基础篇 编程语言理论学科系统知识软件设计篇 软件设计高手成长篇 Linux 系统、内存和网络&#xff08;系统底层知识&#xff09;异步 I/O 模型和 Lock-Free 编程&#xff08;系统底层…

费马大定理:三百年数学圣杯的角逐

来源&#xff1a;和乐数学费马大定理&#xff0c;又被称为“费马最后的定理”。人类前赴后继挑战了三个世纪&#xff0c;多次震惊全世界&#xff0c;耗尽人类众多最杰出大脑的精力&#xff0c;也让千千万万业余者痴迷。费马大定理的故事与数学的历史有着千丝万缕的联系&#xf…

Django - Form和ModelForm

一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…