八、Seata的XA模式

news2024/9/24 7:23:30

目录

  • 八、Seata的XA模式
    • 8.3 ==XA模式多数据源场景==
      • 1 环境搭建
      • 2、使⽤XA模式解决事务

八、Seata的XA模式

8.3 XA模式多数据源场景

1 环境搭建

  • 建库建表
    代码的db.sql中

  • 创建工程
    在这里插入图片描述

  • 添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
  • 编写主配置类
@SpringBootApplication
public class XAMultiApp {
    public static void main(String[] args) {
        SpringApplication.run(XAMultiApp.class);
    }
}
  • 配置文件
server:
  port: 8080
spring:
  datasource:
    nong:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://192.168.239.11:3306/nonghang?serverTimezone=UTC
      username: root
      password: houchen
    jian:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://192.168.239.11:3306/jianhang?serverTimezone=UTC
      username: root
      password: houchen
logging:
  level:
    com:
      hc: debug
  • mapper + 业务代码
    见上述 gitee 仓库

  • 编写多数据源配置

@SpringBootConfiguration
@MapperScans({@MapperScan(basePackages = "com.hc.nong", sqlSessionFactoryRef = "nongFactory"), @MapperScan(basePackages = "com.hc.jian", sqlSessionFactoryRef = "jianFactory")})
public class DbConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.nong")
    public DruidDataSource nongDataSource() {
        return new DruidDataSource();
    }


    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.jian")
    public DruidDataSource jianDataSource() {
        return new DruidDataSource();
    }


    /**
     * 配置NongSqlSession
     */
    @Bean
    public SqlSessionFactory nongFactory(@Qualifier("nongDataSource") DruidDataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionFactory jianFactory(@Qualifier("jianDataSource") DruidDataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

}

2、使⽤XA模式解决事务

  • 添加依赖
<dependency>
     <groupId>io.seata</groupId>
     <artifactId>seata-spring-boot-starter</artifactId>
     <version>1.5.2</version>
 </dependency>
  • yaml文件
    注意:
    我们添加的是seata-spring-boot-starter
    依赖⽀持registry.conf和 file.conf 同时也⽀持把配置编写在application.yml中

但是:
当我们添加的是seata-all依赖时 我们需要添加registry.conf和 file.conf 不能使⽤yml格式配置
因为seata-all没有⾃动配置 所以依赖的不同的包 配置是不同的

seata:
  enabled: true
  registry:
    type: file
  config:
    type: file
  service:
    vgroup-mapping:
      default_tx_group: default
    grouplist:
      default: 127.0.0.1:8091
    disable-global-transaction: false #默认为false 可以不配置
  application-id: abc # 初始化TM和RM使用
  tx-service-group: default_tx_group
  enable-auto-data-source-proxy: true # 设置datasource自动代理
  data-source-proxy-mode: XA          # 指定代理模式 XA
  • ⾃动代理的⽅式
    就是上面yaml文件的最后两行配置

  • 业务代码上面添加注解

   @GlobalTransactional(rollbackFor = Exception.class)
    public void transfer(int fromId, int toId, double monoey) {
        nongMapper.reduceMoney(fromId, monoey);
        int i = 10 / 0;
        jianMapper.increaseMoney(toId, monoey);
    }
  • 测试
    调用接口 http://localhost:8080/user/transfer?fromId=1&toId=1&monoey=100,查看日志
    在这里插入图片描述

⼿动代理的⽅式

  • 修改配置关闭⾃动代理
    在这里插入图片描述

  • ⼿动构建代理数据源

@SpringBootConfiguration
@MapperScans({@MapperScan(basePackages = "com.hc.nong", sqlSessionFactoryRef = "nongFactory"), @MapperScan(basePackages = "com.hc.jian", sqlSessionFactoryRef = "jianFactory")})
public class DbConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.nong")
    public DruidDataSource nongDataSource() {
        return new DruidDataSource();
    }


    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.jian")
    public DruidDataSource jianDataSource() {
        return new DruidDataSource();
    }


    /**
     * ⼿动配置农⾏代理数据源
     * @param dataSource
     * @return
     */
    @Bean
    public DataSourceProxyXA nongXA(@Qualifier("nongDataSource") DruidDataSource dataSource){
        return new DataSourceProxyXA(dataSource);
    }

    /**
     * ⼿动代理建⾏数据源
     * @param dataSource
     * @return
     */
    @Bean
    public DataSourceProxyXA jianXA(@Qualifier("jianDataSource") DruidDataSource dataSource){
        return new DataSourceProxyXA(dataSource);
    }
    /**
     * 配置NongSqlSession
     */
    /*@Bean
    public SqlSessionFactory nongFactory(@Qualifier("nongDataSource") DruidDataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionFactory jianFactory(@Qualifier("jianDataSource") DruidDataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }*/

    /**
     * 配置NongSqlSession
     */
    @Bean
    public SqlSessionFactory nongFactory(@Qualifier("nongXA") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }
    @Bean
    public SqlSessionFactory jianFactory(@Qualifier("jianXA") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }
}

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

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

相关文章

C#动态生成带参数的小程序二维码

应用场景 在微信小程序管理后台&#xff0c;我们可以生成下载标准的小程序二维码&#xff0c;提供主程序入口功能。在实际应用开发中&#xff0c;小程序二维码是可以携带参数的&#xff0c;可以动态进行生成&#xff0c;如如下场景&#xff1a; 1、不同参数决定的显示界面不同…

LED 底层原理 和 GPIO引脚、寄存器操作

目录 LED 原理 LED 的驱动方式 普适的 GPIO 引脚操作方法 GPIO 寄存器操作 LED 原理 当我们学习 C 语言的时候&#xff0c;我们会写个 Hello 程序。 那当我们写 ARM 程序&#xff0c;也该有一个简单的程序引领我们入门&#xff0c;这个程序就是点亮 LED。 我们怎样去点亮…

HNU-计算机网络-实验4-网络层与链路层协议分析(PacketTracer)

计算机网络 课程基础实验四网络层与链路层协议分析&#xff08;PacketTracer&#xff09; 计科210X 甘晴void 202108010XXX 文章目录 计算机网络 课程基础实验四<br>网络层与链路层协议分析&#xff08;PacketTracer&#xff09;一、实验目的二、实验内容4.1 路由器交换…

【基于Python的信用卡客户历史数据分析与挖掘】

基于Python的信用卡客户历史数据分析与挖掘 前言技术栈数据获取与预处理描述性分析建立预测模型模型评估与结果展示Web应用搭建结语 前言 随着金融科技的迅猛发展&#xff0c;信用卡客户的历史数据分析变得越来越重要。本文将介绍如何使用Python、Sklearn和Flask对公开数据集进…

1.1 【应用开发】应用开发简介

写在前面 Screen图形子系统基于客户端/服务器模型&#xff0c;其中应用程序是请求图形服务的客户端&#xff08;Screen&#xff09;。它包括一个合成窗口系统作为这些服务之一&#xff0c;这意味着所有应用程序渲染都是在离屏缓冲区上执行的&#xff0c;然后可以在稍后用于更新…

SpringBoot+Redis 10分钟搞定海量重复提交问题

前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求&#xff0c;我们来解释一下幂等的概念&#xff1a;任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义&#xff0c;最终的含义就是 对数据库的影响只能是一次性的&#xff0c;不能重复处理。如何…

BFC — 张天禹

文章目录 学习链接BFC1. 什么是BFCW3C 上对 BFC 的定义MDN 上对 BFC 的描述更加通俗的描述 2. 开启了BFC能解决什么问题3. 如何开启BFC 演示演示1子元素margin塌陷问题使用BFC解决问题完美解决塌陷问题 演示2被浮动元素覆盖问题使用BFC解决问题例1例2例3例4延申&#xff08;左右…

LeetCode 2415. 反转二叉树的奇数层:深度优先搜索(DFS)

【LetMeFly】2415.反转二叉树的奇数层&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/ 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c…

leetcode面试经典二分系列刷题心得

闲来无事巩固算法基础&#xff0c;发现自己的二分几乎从来没系统刷过题&#xff0c;基础很是薄弱。 二分法不愧称为新人杀手&#xff0c;刷起来很是吃力&#xff0c;感觉明明学了几套二分模板&#xff0c;但是却不知道如何去运用&#xff0c;很多读者在初次尝试刷二分题时候&a…

“你基础不太行啊”

一、创建对象的五种方式 直接new关键字反序列化clone反射class.newInstance反射class.getConstructor 1.1、直接new关键字 1.2、Clone &#xff08;需要实现Cloneable接口&#xff09; 1.3、反射class.newInstance 1.4、反射class.getConstructor 1.5、反序列化 二、与equals…

bottom-up-attention-vqa-master 成功复现!!!

代码地址 1、create_dictionary.py 建立词典和使用预训练的glove向量 &#xff08;1&#xff09;create_dictionary() 遍历每个question文件取出所关注的question部分&#xff0c;qs 遍历qs&#xff0c;对每个问题的文本内容进行分词&#xff0c;并将分词结果添加到字典中&…

小红书商品详情API:电商助力

一、引言 随着互联网的普及和电商行业的快速发展&#xff0c;消费者对于商品信息的获取方式也在不断变化。小红书作为一款以内容分享为主的社交电商平台&#xff0c;吸引了大量用户。为了满足用户对商品信息的快速获取需求&#xff0c;小红书提供了商品详情API接口。本文将探讨…

离散型概率密度函数的分布列⇔分布函数

目录 一、super误区 1.分布函数的定义 二、分布列⇒分布函数 二、分布列⇐分布函数 一、super误区 我在读定义的时候陷入了一个误区&#xff0c;与大家分享一下。 1.分布函数的定义 由于是离散型的概率密度函数&#xff0c;我把他抽象到数轴上理解&#xff1a; 如下分布…

线程的介绍

首先我们来了解一下线程是什么&#xff1a; 首先我们介绍一下程序是什么&#xff1f;程序就是我们编写的代码就叫程序&#xff0c;当我们程序运行的时候则称为进程&#xff0c;在我们现实生活中哪些用到了进程&#xff0c;就比如说我们qq&#xff0c;微信&#xff0c;百度网盘…

兼容性测试:确保系统在各种环境中正常运行

随着数字化时代的到来&#xff0c;软件应用在不同的设备、操作系统和浏览器上运行的需求变得日益重要。为了确保用户体验的一致性和系统的稳定性&#xff0c;兼容性测试变得至关重要。本文将介绍如何使用兼容性测试&#xff0c;以保证软件在各种环境中无缝运行。 1. 确定目标平…

ssl证书问题导致本地启动前端服务报500

报错如下&#xff1a;注意查看报错信息 问题&#xff1a;系统原是http&#xff0c;后台调整为https后&#xff0c;ssl证书有点问题&#xff0c; vue项目本地服务&#xff0c;使用代理&#xff0c;webpack默认&#xff0c;证书强校验&#xff0c;导致请求无法发出&#xff0c;后…

Linear classifiers——线性分类器

1.(Generalized) Linear classifiers——广义线性分类器 1.1 模型 假如有两类数据&#xff0c;类别标签为y 1和y -1 我们可以使用一个线性函数将其分类&#xff0c;二维形式 通常x增加一个恒等于1的维度&#xff0c;可以将b合并进w&#xff0c;于是更一般的形式为 ,就相当于…

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 &#xff0c;操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

C++使用UDP

C使用UDP 对C使用UDP做了简单封装&#xff0c;可直接运行 头文件udp.h #pragma once #include <Winsock.h> #pragma comment(lib,"WS2_32.lib")#define LOCAL_IP_ADDR INADDR_ANY //当前应用程序接收的IP地址 #define LOCAL_PORT 9527 …

PixPin带有截图/贴图/长截图/文字识别/标注的截图工具,很好用

官网地址&#xff1a;PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 确实挺好用的&#xff0c;推荐一下