(附源码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/test
         spring.datasource.primary.username=root
         spring.datasource.primary.password=root
         spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
         spring.datasource.primary.xa-data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource
                  #数据源二
         spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test1
         spring.datasource.secondary.username=root
         spring.datasource.secondary.password=root
         spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
         spring.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"));//扫描指定目录的xml
        return 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"));//扫描指定目录的xml
        return 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

时间: 2024-10-10 02:03:08

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

spring framework项目源码github托管地址

方法一:直接下载,github托管地址:http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 方法二:svn检出 一次性源码全量包下载的方法.spring的项目包会托管到github网站上,所以可以从github网站上得到spring任意版本的全量包(使用svn客户端下载),方法如下:1.安装svn客户端,随便使用自己喜欢的一个就行,通常用的最多的是TortoiseSVN.自己下载安装.2.检出(下

Spring Boot自动配置源码解析(基于Spring Boot 2.0.2.RELEASE)

在Spring Boot官方介绍中,首一段话是这样的(如下图).我们可以大概了解到其所表达的含义:我们可以利用Spring Boot写很少的配置来创建一个非常方便的基于Spring整合第三方类库的单体企业级应用.相信使用过Spring Boot的人都知道,她在这方面从前到后的一系列整合.本篇文字将带你进入具体的实现细节. 首先我们写一段Spring Boot应用启动类的代码如下: 1 package com.springTest; 2 3 import org.springframework.b

使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】

项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jQuery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js. jsonp快速入门: [原创]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 关于jquery.ajax的jsonp方法是用以及其error回调函数不能正确执行,请参考园长dudu的文章: jquery ajax中使用jsonp的限制 jQuery插件jQu

rhel rpm源码包下载地址

http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/

Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO

距离上次发布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了,最近利用空闲时间,把今日头条客户端完善了下.完善的功能一个一个全部实现后,就放整个源码.开发的进度就是按照一个一个功能的思路走的,所以开发一个小的功能,如果有用,就写一个专门的博客以便有人用到独立的功能可以方便使用. 这次实现的功能是很多新闻阅读器(网易,今日头条,360新闻等)以及腾讯视频等里面都会出现的频道管理功能. 下面先上这次实现功能的效果图:(注:这个效果图没有拖拽的时候移动动画,DEMO里

门店小程序开发全过程(附源码)

说到微信小程序的创立初衷,线下门店绝对是应用的大场景,也符合小程序"用完即走"的理念.从这一两年的发展来看,多个小程序爆款也出自门店小程序,如周黑鸭.星巴克以及奶茶店小程序等等.门店小程序的研发需求和使用需求都很大,下边我们就具体讲讲门店小程序的应用场景及研发过程. 一.场景 场景化消费的同时,用户可扫描桌上的二维码,快速展现小程序系统 浏览购买小程序提供的线上服务 留存用户,后期可与用户线上互动,增强用户粘性 即:通过线下导流到线上,线上购买服务,线下体验和享受服务,通过小程序完美实

Android 4.4 全套源码及子模块源码的下载方法

博文<Android源码下载--用git clone实现单个目录下载>介绍了采用git clone方法下载Android单个目录源码的方法,这篇文章已经有四年的历史,这期间Google对源代码的管理网站已经进行了更改,直接采用原来的方法下载源代码已经失效.本文介绍了在ubuntu下(在Windows下安装Cygwin,通过Cygwin也可在Windows里通过本文的下载步骤下载Android源码)获取目前最新的Android 4.4 全套源码以及单个自模块源码的下载方法,可根据本文方法下载全套

详解postfix邮箱服务器安装、配置及其工作原理(内附源码包)

简介 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件.这真是一个让人吃惊的数字.Postfix试图更快.更容易管理.更安全,同时还与sendmail保持足够的兼容性. 工作原理 客户端通过Outlook软件,向邮件

手把手教你部署WEB邮件系统Squirrelmail小松鼠(内附源码包)

简介 Web邮件系统指的是提供给用户发信.收信的网页操作界面,能够完成和MUA软件类似的邮件管理.通讯簿等附加功能,同时Web邮件系统依赖于已有的收信.发信服务器,但不需要用户预先配置邮箱属性,因此使用更加方便,在Internet中应用十分广泛.而SquirrelMail是使用PHP开发的一套网页程序可以与 Postfix. Dovecot很好地协作,通过Web界面提供邮件发送.接收和管理操作. 实验环境 系统环境:centos6.5 LinuxIP地址:192.168.1.77(Linux)