分布式事务解决方案之Atomikos

news2024/11/26 0:29:34

这种方式只适用于  

对于真正分布式应用不适用,原因在于 Atomikos需要获得所有数据源  统一进行事务管理

JTA(Java Transaction API)被称为Java事务API,是由Java语言提供的一套解决分布式事务的API标准

 XA协议

1
2
3
1. XA协议是JTA的基础
2. XA协议最早由Tuxedo首先提出,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准
3. XA协议采用两阶段提交方式来管理分布式事务,MySQL从5.x版本开始支XA协议

Atomikos事务管理器

3.1 Atomikos简介

1
2
Atomikos是一款Java/JTA事务处理工具,在SpringBoot的官网文档的分布式事务处理中Atomikos作为一种分布式事务的解决方案.
文档地址: https://docs.spring.io/spring-boot/docs/2.1.18.RELEASE/reference/html/boot-features-jta.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
从SpringBoot的官网可以看出,官网介绍非常简单,说了要想使用需要添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

然后就没介绍一些更多细节,不过Atomikos相对来说比较简单,只需要一个核心API即可

核心API介绍
1. AtomikosDataSourceBean
   1.1 这个类是Atomikos连接池的首选类
   1.2 如果要开启Atomikos JTA首选就是实例化此类
   1.3 接下来要做的就是实例化此类的对象,并设置对象的属性
   1.4 创建好此类对象后它会自动的加入到事务管理中
   1.5 所有通过此类获取的连接执行的SQL都会加入到JTA事务管理

Configuration
@MapperScan(basePackages = {"com.example.demo.mapper"},sqlSessionFactoryRef = "primarySqlSessionFactory")
public class DataSourceConfig1 {
    @Value("${spring.datasource.primary.url}")
    private String url;
    @Value("${spring.datasource.primary.username}")
    private String username;
    @Value("${spring.datasource.primary.password}")
    private String password;
    @Value("${spring.datasource.primary.driver-class-name}")
    private String driverClassName;


    @Primary
    @Bean(name="primaryDataSource")
    public DataSource primaryDataSource(){

        //return DataSourceBuilder.create().build();
        //将事务统一交给Atomikos处理   不要自己定义事务管理器
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        DruidXADataSource dds = new DruidXADataSource();
        dds.setUsername(username);
        dds.setPassword(password);
        dds.setUrl(url);
        dds.setDriverClassName(driverClassName);
        ds.setXaDataSource(dds);
        ds.setUniqueResourceName("primaryDataSource");
        return ds;
    }

    @Primary
    @Bean(name="primarySqlSessionFactory")
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage("com.example.demo.pojo");
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*Mapper.xml"));
        SqlSessionFactory sqlSessionFactory = bean.getObject();
        sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
        //sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);
        return sqlSessionFactory;
    }

    @Primary
    @Bean(name="primarySqlSessionTemplate")
    public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory")SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Primary
    @Bean(name="primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource")DataSource dataSource){
        return  new JdbcTemplate(dataSource);
    }


//    @Bean(name="primaryTransactionManager")
//    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource")DataSource dataSource){
//        return new DataSourceTransactionManager(dataSource);
//    }

}
@Configuration
@MapperScan(basePackages = {"com.example.demo.mapper2"},sqlSessionFactoryRef = "secondSqlSessionFactory")
public class DataSourceConfig2 {

        @Value("${spring.datasource.second.url}")
        private String url;
        @Value("${spring.datasource.second.username}")
        private String username;
        @Value("${spring.datasource.second.password}")
        private String password;
        @Value("${spring.datasource.second.driver-class-name}")
        private String driverClassName;




        @Bean(name="secondDataSource")
        //@ConfigurationProperties(prefix = "spring.datasource.second")
        public DataSource secondDataSource(){
            //return DataSourceBuilder.create().build();

            AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
            DruidXADataSource dds = new DruidXADataSource();
            dds.setUsername(username);
            dds.setPassword(password);
            dds.setUrl(url);
            dds.setDriverClassName(driverClassName);
            ds.setXaDataSource(dds);
            ds.setUniqueResourceName("secondDataSource");
            return ds;

        }


        @Bean(name="secondSqlSessionFactory")
        public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setTypeAliasesPackage("com.example.demo.pojo2");
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers2/*Mapper.xml"));
            SqlSessionFactory sqlSessionFactory = bean.getObject();
            sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
            //sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);
            return sqlSessionFactory;
        }


        @Bean(name="secondSqlSessionTemplate")
        public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory")SqlSessionFactory sqlSessionFactory){
            return new SqlSessionTemplate(sqlSessionFactory);
        }


        @Bean(name="secondJdbcTemplate")
        public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource")DataSource dataSource){
            return  new JdbcTemplate(dataSource);
        }


//        @Bean(name="secondTransactionManager")
//        public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDataSource")DataSource dataSource){
//            return new DataSourceTransactionManager(dataSource);
//        }
}

上面用的druid连接池

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
<dependency>

使用时候

@Transactional  不要指定事务管理器  也不要自定义事务管理器

测试中 连接阿里云RDS服务器一直有问题

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

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

相关文章

ChatGPT、Llama-2等大模型,能推算出你的隐私数据!

ChatGPT等大语言模型的推理能力有多强大&#xff1f;通过你发过的帖子或部分隐私数据&#xff0c;就能推算出你的住址、年龄、性别、职业、收入等隐私数据。 瑞士联邦理工学院通过搜集并手工标注了包含520个Reddit&#xff08;知名论坛&#xff09;用户的个人资料真实数据集Pe…

MySQL导入数据库报错Error Code: 2006

Error Code: 2006 - MySQL server has gone away 因为导入的某张表数据过大导致导入中途失败 , 修改max_allowed_packet 即可解决。 SET GLOBAL max_allowed_packet 1024*1024*200;

Pytest UI自动化测试实战实例

环境准备 序号库/插件/工具安装命令1确保您已经安装了python3.x2配置python3pycharmselenium2开发环境3安装pytest库pip install pytest4安装pytest -html 报告插件pip install pytest-html5安装pypiwin32库(用来模拟按键)pip install pypiwin326安装openpyxl解析excel文件库p…

享受户外的美好时光:花园吊椅的魅力

拥有舒适的花园吊椅&#xff0c;就像在家中创造了一个度假天堂。这些轻松摇摆的座位为您提供了一个完美的地方&#xff0c;既能舒适躺卧&#xff0c;又能让您在家中的花园或庭院中感受到度假的氛围。度过美好时光的吊椅&#xff0c;将成为家庭花园的一大亮点&#xff0c;为您带…

Python某建筑平台数据, 实现网站JS逆向解密

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: 首先我们先来安装一下写代码的软件&#xff08;对没安装的小白说&#xff09; Python 3.8 / 编译器 Pycharm 2021.2版本 / 编辑器 专业版是付费的 <文章下方名片可获取魔法永久用~> 社区版是免费的 模块…

学生成绩管理神器

在信息化时代&#xff0c;你是否还在为处理大量的学生成绩数据而烦恼&#xff1f;是否还在用传统的方式&#xff0c;手动输入和整理成绩信息&#xff1f;今天&#xff0c;我将向你展示如何利用各种代码和Excel&#xff0c;打造一个学生自助查询成绩的神器&#xff0c;让数据管理…

ClickHouse 学习之基础入门(一)

第 1 章 ClickHouse 入 门 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用 C 语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用 SQL 查询实时生成分析数据报告。 …

词典查询工具django-mdict

什么是 django-mdict &#xff1f; django-mdict 不是词典软件&#xff0c;是词典查询的脚本工具&#xff0c;主要目的是解决词典数量多&#xff0c;手机容量不足的问题&#xff0c;是对其他词典软件局域网在线查询功能的补充&#xff0c;是用 django 实现的 mdict 词典查询工具…

递归与快速算法

借鉴&#xff1a; 4分钟彻底掌握递归算法、斐波那契数列、快速排序&#xff0c;不再怕面试&#xff01;_哔哩哔哩_bilibili 可直接观看借鉴里的视频 快速算法

vcruntime140.dll在哪下载?vcruntime140.dll文件说明及其下载方法

vcruntime140.dll在哪下载&#xff1f;为啥还有这样的问题&#xff1f;其实就是你电脑的vcruntime140.dll文件丢失了&#xff0c;你需要重新去下载一个vcruntime140.dll文件&#xff0c;这时候你就会想这个东西到底要去哪里下载&#xff0c;今天我们就来给大家详细的解析一下&a…

AI视频 | Runway的史诗级更新真的那么震撼吗?来看我的试用体验!

就在昨天&#xff0c;Runway&#xff0c;这个生成式AI的领头羊&#xff0c;正式在X上发布了他们史诗级更新 看下视频 【视频2】 这个确实看起来太棒了 注册个账号&#xff0c;看下效果咋样 地址百度哈&#xff0c;注册登录也比较方便 直接邮箱即可 不过我是直接google账号登录的…

从使用的角度看 ByConity 和 ClickHouse 的差异

自 ClickHouse Inc 宣布其重要新功能仅在 ClickHouse Cloud 上开放以来&#xff0c;一些关注 ByConity 开源的社区小伙伴也来询问 ByConity 后续开源规划。为回答社区疑问&#xff0c;我们将之前分享的关于 ByConity 与 ClickHouse 相关功能对比的 webinar 整理为文章&#xff…

MinIO多容器配置NGINX代理实践(docker-compose版本)

以下nginx配置 分别将本机的9001端口代理到minio1,minio2,minio3,minio4主机的9001端口。用于minio后台 分别将本机的9000端口代理到minio1,minio2,minio3,minio4主机的9000端口。用于minioApi events {worker_connections 1024; }http {upstream minio_console {server min…

Selenium元素定位之页面检测技巧

在进行web自动化测试的时候进行XPath或者CSS定位&#xff0c;需要检测页面元素定位是否正确&#xff0c;如果用脚本去检测&#xff0c;那么效率是极低的。 一般网上推选装额外的插件来实现页面元素定位检测 如&#xff1a;firebug。 其实F12开发者工具就能直接在页面上检测元…

广东厂家建筑木模板:桥梁工地施工的理想选择

广东地区一直以来都是中国建筑业的重要制造中心之一。在这个繁忙的地方&#xff0c;建筑行业的发展需要可靠且高质量的建筑材料。在众多的建筑材料中&#xff0c;建筑木模板作为一种重要的施工辅助工具&#xff0c;被广泛应用于桥梁工地的施工中。 广东厂家建筑木模板以其优质的…

初识RTOS

缺点&#xff1a; 如果一心多用&#xff0c;上一秒钟喂饭&#xff0c;下一秒钟回同事信息。 虽然还是一个脑子&#xff0c;一次智能处理一件事&#xff0c;但是给人的感觉就不会像上面那样了。人体就是一个嵌入式。 CPU是他的大脑。 手就是总线&#xff0c;可以操作芯片之外的…

深度学习服务器(Linux)开发环境搭建教程

当你拿到一台服务器的使用权时&#xff0c;最头疼的莫过于登陆服务区并配置开发环境。本文将从0开始&#xff0c;讲述一台刚申请的服务器远程登陆并配置开发环境的全过程。希望对你有所帮助 1.登陆服务器 打开MobaXterm软件&#xff0c;创建一个新的Session&#xff0c;选择S…

探索数据库世界的奥秘:MySQL初学者必备指南!

数据库开发-MySQL 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.2 外键约束 2.2 一对一2.3 多对多 1. 数据库操作-DQL 1.1 介绍 DQL英文全称是Da…

ubuntu系统调整根目录空间

调整根目录大小&#xff1a; 一旦您释放了一部分空间&#xff0c;您可以使用 LVM 工具来调整根目录的大小。 运行 sudo lvresize -r -L <size>G /dev/mapper/ubuntu--vg-ubuntu--lv 命令&#xff0c;将根目录的逻辑卷&#xff08;logical volum…

C++算法:拼接最大数

题目 给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 求满足该条件的最大数…