返回顶部
首页 > 资讯 > 后端开发 > Python >springboot-jta-atomikos多数据源事务管理实现
  • 319
分享到

springboot-jta-atomikos多数据源事务管理实现

2024-04-02 19:04:59 319人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录背景源码地址项目目录结构 实现1.添加依赖 pom.xml2.配置数据库连接信息 application.properties3.创建多数据源 DBAtomikosCo

背景

我们平时在用springboot开发时,要使用事务,只需要在方法上添加@Transaction注解即可,但这种方式只适用单数据源,在多数据源下就不再适用;

比如在多数据源下,我们在一个方法里执行了数据源A的操作,又执行了数据源B的操作,如果报错了,事务只会回滚主数据源或者是指定事务的数据源数据(@Transactional(value="指定事务")),另一个数据源是不会回滚的;

这种情况下,单纯的@Transactional事务注解是无法实现的,此时就需要用到多数据源事务管理;

以下项目里实现了普通情况下的事务处理和使用springboot-jta-atomikos事务处理

本文主要介绍使用springboot-jta-atomikos来实现;

源码地址

https://GitHub.com/lvlq73/springboot-jta-atomikos

项目目录结构

 实现

1.添加依赖 pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2.配置数据库连接信息 application.properties

#atomikos测试
spring.datasource.test1.url=jdbc:Mysql://127.0.0.1:3306/test1?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
spring.datasource.test1.user=root
spring.datasource.test1.passWord=arsenal

spring.datasource.test2.url=jdbc:mysql://127.0.0.1:3306/test2?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
spring.datasource.test2.user=root
spring.datasource.test2.password=arsenal

3.创建多数据源 DBAtomikosConfig.java

package com.llq.atomikos.config;

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.jta.JtaTransactionManager;

import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import java.util.Properties;


@Configuration
public class DBAtomikosConfig {

    //--------------------数据源1--------------------
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Bean
    public Properties testOneProperties() {
        return new Properties();
    }

    @Bean(name = "testOneDataSource")
    @Primary
    public DataSource testOneDataSource() {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        Properties prop = testOneProperties();
        ds.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource");
        ds.setUniqueResourceName("testOne");
        ds.setXaProperties(prop);
        return ds;
    }

    @Bean
    @Primary
    public JdbcTemplate testOneJdbcTemplate(@Qualifier("testOneDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    //--------------------数据源2--------------------
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    @Bean
    public Properties testTwoProperties() {
        return new Properties();
    }

    @Bean(name = "testTwoDataSource")
    public DataSource testTwoDataSource() {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        Properties prop = testTwoProperties();
        ds.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource");
        ds.setUniqueResourceName("testTwo");
        ds.setXaProperties(prop);
        return ds;
    }

    @Bean
    public JdbcTemplate testTwoJdbcTemplate(@Qualifier("testTwoDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    //--------------------配置spring的JtaTransactionManager,底层委派给atomikos进行处理--------------------
    @Bean
    public JtaTransactionManager jtaTransactionManager () {
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        UserTransaction userTransaction = new UserTransactionImp();
        return new JtaTransactionManager(userTransaction, userTransactionManager);
    }
}

4.测试事务类 TestAtomikos.java

package com.llq.atomikos.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
public class TestAtomikos implements ITest{

    @Qualifier("testOneJdbcTemplate")
    @Autowired
    private JdbcTemplate testOneJdbcTemplate;

    @Qualifier("testTwoJdbcTemplate")
    @Autowired
    private JdbcTemplate testTwoJdbcTemplate;

    
    @Transactional(rollbackFor = Exception.class, value = "jtaTransactionManager")
    public void test() {
        testOneJdbcTemplate.execute("insert into user (name, age) values ('张三', 18);");
        testTwoJdbcTemplate.execute("insert into user (name, age) values ('李四', 20);");
    }

    
    @Transactional(rollbackFor = Exception.class, value = "jtaTransactionManager")
    public void testByException() {
        testOneJdbcTemplate.execute("insert into user (name, age) values ('张三', 18);");
        testTwoJdbcTemplate.execute("insert into user (name, age) values ('李四', 20);");
        int i = 1/0;
    }
}

5.测试 SpringbootAtomikosApplicationTests.java

    //使用atomikos
    private static Class CLS = TestAtomikos.class;

    @Autowired
    ApplicationContext applicationContext;

    @Test
    public void testByException() {
        ITest test = (ITest) applicationContext.getBean(CLS);
        test.testByException();
    }

测试结果

执行错误

数据库test1 user表没有记录

数据库test2 user表没有记记录

到此这篇关于springboot-jta-atomikos多数据源事务管理实现的文章就介绍到这了,更多相关springboot 多数据源事务管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springboot-jta-atomikos多数据源事务管理实现

本文链接: https://lsjlt.com/news/142358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot-jta-atomikos多数据源事务管理实现
    目录背景源码地址项目目录结构 实现1.添加依赖 pom.xml2.配置数据库连接信息 application.properties3.创建多数据源 DBAtomikosCo...
    99+
    2024-04-02
  • springboot-jta-atomikos多数据源事务管理如何实现
    这篇文章主要介绍“springboot-jta-atomikos多数据源事务管理如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot-jta-atomikos多数据源事务管理如...
    99+
    2023-06-29
  • SpringBoot2使用JTA组件实现基于JdbcTemplate多数据源事务管理(亲测好用)
    目录一、JTA组件简介什么是JTA什么是XA协议二、SpringBoot整合JTA1、核心依赖2、环境配置3、jta组件配置类4、创建一个Service实现,模拟两种不同的情况。5、...
    99+
    2024-04-02
  • java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)
    目录前言一、项目依赖二、数据源配置三、数据源的注册四、配置数据源对应的sqlSessionFactory五、测试接口六、建立JtaTestContoller.java七、在test....
    99+
    2024-04-02
  • springboot+mybatis实现多数据源
    1. 前言 最近做项目碰到了一个需要连4个不同数据库的需求,其中db1、db2表结构都不相同;另外两个数据库same_db_private、same_db_public表结构完全相同,一个对内一个对外...
    99+
    2023-09-11
    mybatis spring boot java
  • springboot+mybatisplus+druid如何实现多数据源+分布式事务
    这篇文章主要介绍springboot+mybatisplus+druid如何实现多数据源+分布式事务,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  jdk环境:1.8  springboot:2.1.3.RELEA...
    99+
    2023-06-02
  • SpringBoot整合atomikos实现跨库事务的详细方案
    目录背景方案设计Maven配置注册XA数据源注册XA事务管理器定义XA事务切面配置XA事务日志背景 框架之前完成了多数据源的动态切换及事务的处理,想更近一步提供一个简单的跨库事务处理...
    99+
    2024-04-02
  • SpringBoot实现多数据源的切换实践
    目录前言工程结构编码实现yml文件主数据源MainDatasourceProperties其他数据源DynamicDatasourceProperties数据源配置类Datasour...
    99+
    2024-04-02
  • SpringBoot多数据源切换怎么实现
    本篇内容主要讲解“SpringBoot多数据源切换怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源切换怎么实现”吧!配置文件(YML)spring: ...
    99+
    2023-06-30
  • springboot+mybatis实现mysql和oracle多数据源
    1.aop+注解方式 在实际项目中很多时候会涉及到多个数据库的访问,或者数据库读写分离的形式。 下面通过使用 Aspect+注解来实现mysql+oracle的多数据源配置(注意:事务一致性未提供) 首先要去oracle官网下载ojdbc的...
    99+
    2023-09-05
    spring boot mybatis mysql oracle 后端
  • Springboot实现多数据源切换详情
    目录1. 实现效果1.1 controller1.2 mybatis.xml1.3 application.yml1.4 启动类2. 注解2.1 @Router3. 分库策略3.1 ...
    99+
    2024-04-02
  • Spring Boot多数据源及其事务管理配置方法
    准备工作先给我们的项目添加Spring-JDBC依赖和需要访问数据库的驱动依赖。配置文件spring.datasource.prod.driverClassName=com.mysql.jdbc.Driverspring.datasourc...
    99+
    2023-05-31
    spring boot 多数据源
  • Spring Boot多数据源处理事务实例分析
    这篇“Spring Boot多数据源处理事务实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&n...
    99+
    2023-06-30
  • springboot+springJdbc+postgresql 实现多数据源的配置
    背景 最近公司在服务拆迁,接口转移,相同的功能接口到要迁移到对应的服务中,因为时间比较赶,别问为什么没给时间,没人,没资源,但是活还是得干的,为了减少工作量和稳妥的需要分两步走 ...
    99+
    2024-04-02
  • SpringBoot多数据源切换实现代码(Mybaitis)
    目录前言配置文件(YML)核心代码DynamicDataSourceDynamicDataSourceServiceDynamicDataSourceConfig加载YML数据库配置...
    99+
    2024-04-02
  • SpringBoot怎么实现多数据源的切换
    这篇文章主要介绍“SpringBoot怎么实现多数据源的切换”,在日常操作中,相信很多人在SpringBoot怎么实现多数据源的切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎么实现多...
    99+
    2023-06-29
  • SpringBoot搭建多数据源的实现方法
    首先我们建立两个数据库(可以不在同一台电脑上): multiple_order: DROP DATABASE IF EXISTS `multiple_order`; CREATE...
    99+
    2024-04-02
  • SpringBoot多数据源的两种实现方式实例
    目录前言基于dynamic-datasource实现多数据源dynamic-datasource介绍dynamic-datasource特性使用 @DS 切换数据源@DS使用实例基于...
    99+
    2024-04-02
  • SpringBoot+Mybatis plus实现多数据源整合的实践
    SpringBoot 版本为1.5.10.RELEASE,Mybatis plus 版本为2.1.8。 第一步:填写配置信息: spring: aop: proxy-...
    99+
    2024-04-02
  • springboot中mybatis多数据源动态切换实现
    目录多数据源配置引入 动态数据源路由实现 动态数据源切换使用 案例源码 在开发中,动态数据源配置还是用的比较多的,比如在多数据源使用方面,又或者是在多个DB之间切换方面。这里给出一个...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作