分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos)

news2024/11/17 9:55:25

正文

1、解决的应用场景是分布式事务,每个服务有独立的数据库。
在这里插入图片描述

2、例如:A服务的数据库是A1,B服务的数据库是B2,A服务通过feign接口调用B服务,B涉及提交数据到B2,业务是在B提交数据之后,在A服务内报错。

所以,希望B能回滚事务。这就是跨库的数据回滚

下载

seata下载地址

seata的配置

1、创建一个数据库,把seata的表生成出来

在这里插入图片描述
在这里插入图片描述

2、修改seata配置文件

注意有其他的需求可以参考example文件,我这里直接展示本地修改后的

#  Copyright 1999-2019 Seata.io Group.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  #extend:
    #logstash-appender:
     # destination: 127.0.0.1:4560
    #kafka-appender:
     # bootstrap-servers: 127.0.0.1:9092
    #  topic: logback_to_logstash

console:
  user:
    username: seata
    password: seata
seata:
  #data-source-proxy-mode: XA
  #tx-service-group: default
  #service:
    #vgroup-mapping: # 事务组与cluster的映射关系
    #  default_tx_group: DEFAULT
    #grouplist:
    #  DEFAULT: 127.0.0.1:8091
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group : "WEIMEIZI_GROUP"
      namespace: 
      username: "nacos"
      password: "nacos"
      #data-id: seataServer.properties
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: "WEIMEIZI_GROUP"
      namespace:
      cluster: default
      username: "nacos"
      password: "nacos"
  store:
    # support: file 、 db 、 redis
    mode: db
    # 数据源驱动类名称
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
      user: root
      password: root
      min-conn: 10
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 1000
      max-wait: 5000
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login

3、修改nacos配置文件

新增:

seata:
  data-source-proxy-mode: XA
  tx-service-group: default
  service.vgroupMapping.default: default
  service.default.grouplist: 127.0.0.1:8091

注意如果你用的是其他版本的seata,可能service.vgroupMapping.default和 service.default.grouplist在其他版本命名不一样,报错就修改

4、涉及到分布式事务的数据库都要创建undo_log

这张表在seata官方包里是没有的,如果不创建,代码会报错,找不到表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (
  `branch_id` bigint(20) NOT NULL COMMENT '分支事务ID',
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '全局事务ID',
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '上下文',
  `rollback_info` longblob NOT NULL COMMENT '回滚信息',
  `log_status` int(11) NOT NULL COMMENT '状态,0正常,1全局已完成',
  `log_created` datetime(6) NOT NULL COMMENT '创建时间',
  `log_modified` datetime(6) NOT NULL COMMENT '修改时间',
  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

服务注册

满足1、2、3步后,启动
在这里插入图片描述
就会发现nacos注册上了seata
在这里插入图片描述

项目的代码

主要是两个注解:
@EnableAutoDataSourceProxy
@GlobalTransactional(rollbackFor = Exception.class)

A服务的方法:
在这里插入图片描述
B服务的方法:
在这里插入图片描述
B服务的方法正常执行并提交数据到B库,但是A服务报错了,所以B服务得回滚数据

A、B的Application都要加上@EnableAutoDataSourceProxy
在这里插入图片描述

注意:引入的pom文件:
两个服务的pom都要引入seata,注意:有个包叫做seata-all,这个包不要一起引入进去,否则会报:数据源错误

<!-- Seata-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.7.0</version>
        </dependency>

结语

事务回滚成功是根据XID,以下是成功回滚的截图

A服务的控制台输出:
在这里插入图片描述

B服务的控制台输出:
在这里插入图片描述

备注

如果因为nacos的配置文件过大,导致netty报错,那么,就修改netty的内存,文件是application.yml

#服务器端口
server:
  port: 8200
  netty:
    max-chunk-size: 1545270062
    max-initial-line-length: 1545270062
    h2c-max-content-length: 1545270062

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

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

相关文章

数学建模:层次分析法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 层次分析法 步骤描述 将问题条理化&#xff0c;层次化&#xff0c;构建出一个有层次的结构模型。层次分为三类&#xff1a;目标层&#xff0c;准则&#xff08;指标&#xff09;层&#xff0c;方案层。比…

Mybatis1.6 添加数据

1.6 添加数据 1.6.1 编写接口方法1.6.2 编写SQL语句1.6.3 编写测试方法1.6.4 添加-主键返回 如上图是我们平时在添加数据时展示的页面&#xff0c;而我们在该页面输入想要的数据后添加 提交 按钮&#xff0c;就会将这些数据添加到数据库中。接下来我们就来实现添加数据的操作。…

前端调用电脑摄像头

项目中需要前端调用&#xff0c;所以做了如下操作 先看一下效果吧 主要是基于vue3&#xff0c;通过canvas把画面转成base64的形式&#xff0c;然后是把base64转成 file文件&#xff0c;最后调用了一下上传接口 以下是代码 进入页面先调用一下摄像头 navigator.mediaDevices.ge…

低成本32位单片机电动工具无感方波控制方案

RAMSUN介绍基于灵动32位微处理器MM32SPIN0230的BLDC电动工具无感方波控制方案&#xff0c;包括MM32SPIN0230芯片资源。 以下是电动工具无感方波控制方案的简述&#xff1a; MM32SPIN0230电动工具专用板 芯片介绍 MM32SPIN0230系列是灵动微MindSPIN旗下高性能的单电机控制产品…

04-基础例程4

基础例程4 1、RGB彩灯 实验介绍 ​ WS2812B是一款智能控制的LED光源&#xff0c;控制电路和RGB芯片集成在一个5050组件的封装中。 ​ 可以将多个RGB灯珠级联&#xff0c;如下图所示&#xff1a; ​ 3个最基本的颜色为红、绿、蓝&#xff08;RGB&#xff09;&#xff0c;均是…

Elasticsearch实战(三):Springboot实现Elasticsearch搜索推荐

文章目录 系列文章索引一、什么是搜索推荐二、新增测试数据三、搜索推荐的实现1、es官网2、Java实现搜索推荐3、总结 系列文章索引 Elasticsearch实战&#xff08;一&#xff09;&#xff1a;Springboot实现Elasticsearch统一检索功能 Elasticsearch实战&#xff08;二&#x…

Python asyncio 性能分析

文章目录 1. 工具1.1 cProfile2.1 yappi 2. 可视化2.1 SnakeViz2.2 gprof2dot 1. 工具 1.1 cProfile 一般对分析python性能的工具都会用cprofile。但是这玩意对多线程和asyncio的支持并不友好&#xff0c;如果用它对asyncio分析&#xff0c;会发现CPU都耗费在了poll上面&…

动态维护直径 || 动态维护树上路径 || 涉及LCA点转序列 || 对欧拉环游序用数据结构维护:1192B

https://www.luogu.com.cn/problem/CF1192B 对于直径的求法&#xff0c;常用dp或两次dfs&#xff0c;但如果要动态维护似乎都不太方面&#xff0c;那么可以维护树上路径最大值。 树上路径为&#xff1a; d e p u d e p v − 2 d e p l c a ( u , v ) dep_udep_v-2\times de…

如何实现AI的矢量数据库

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而&#xff0c;人工智能模型有点像美食厨师。他们可以创造奇迹&#xff0c;但他们需要优质的成分。人工智能模型在大多数输入上都做得很好&#xff0c;但如果它们以最优化的格式接收输入&#xff0c;它们就会真正…

Python的pymysql模块与MySQL数据库的互动:基础与实例

Python的pymysql模块与MySQL数据库的互动&#xff1a;基础与实例 一、连接数据库二、创建游标三、执行SQL命令四、关闭连接 在Python的世界里&#xff0c;操作MySQL数据库最常用的库就是pymysql。 pymysql是一个灵活且易于使用的库&#xff0c;它允许我们以Python的方式操作MyS…

网络安全研究和创新:探讨网络安全领域的最新研究成果、趋势和创新技术,以及如何参与其中。

第一章&#xff1a;引言 随着数字化时代的到来&#xff0c;网络安全变得比以往任何时候都更加重要。无论是个人、企业还是国家&#xff0c;都面临着日益复杂和隐蔽的网络威胁。为了确保我们的信息和资产的安全&#xff0c;网络安全研究变得至关重要。本文将深入探讨网络安全领…

搭建 Qt6 + Visual Studio 开发环境

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 在 Windows 中&#xff0c;如果想要开发 Qt 应用程序&#xff0c;可以选择多种方式&#xff1a; Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

【前车之鉴】: 2023最新教程-将java程序打包到maven私服的正确打开方式,详细流程介绍不怕你掌握不了

文章目录 为什么看这篇整体流程1. 注册账号【首次需要】2. 工单申请【新项目必须】3. 项目配置【新项目必须】4. 授权认证【新项目必须】5. 一键发布 最后也很重要 为什么看这篇 一是当前网络上一些博客有遗漏部分&#xff0c;这里做补充&#xff0c;二是网上思路没错&#xff…

Ansible自动化运维工具(二)

目录 &#xff08;6&#xff09;copy模块 &#xff08;7&#xff09;file模块 ​编辑​编辑&#xff08;8&#xff09;hostname模块 &#xff08;9&#xff09;ping模块 &#xff08;10&#xff09;yum 模块 &#xff08;11&#xff09;service/system模块 ​编辑 ​…

11.TIM定时中断

STM32标准库开发-总目录-传送门 目录 TIM简介 定时器类型 基本定时器 1.基本定时器时基单元 2.时基单元的工作流程 3.主模式触发DAC的功能 通用定时器 1.通用定时器与基本定时器异同 2.内外时钟源选择功能 3. 编码器接口功能 4.主从触发模式功能 5.输出比较功能 6…

Excel:通过Lookup函数提取指定文本关键词

函数公式&#xff1a;LOOKUP(9^9,FIND($G 2 : 2: 2:G 6 , C 2 ) , 6,C2), 6,C2),G 2 : 2: 2:G$6) 公式解释&#xff1a; lookup第一参数为9^9&#xff1a;代表的是一个极大值的数据&#xff0c;查询位置里面最接近这一个值的数据&#xff1b;lookup第二参数用find函数代替&am…

【ES】笔记-集合介绍与API

集合是一种不允许值重复的顺序数据结构。 通过集合我们可以进行并集、交集、差集等数学运算&#xff0c; 还会更深入的理解如何使用 ECMAScript 2015(ES2015)原生的 Set 类。 构建数据集合 集合是由一组无序且唯一(即不能重复)的项组成的。该数据结构使用了与有限集合相同的数…

基于AVR128单片机抢答器proteus仿真设计

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void timer0_init() //定时器初始化 { TCCR00x07; //普通模式&#xff0c;OC0不输出&#xff0c;1024分频 TCNT0f_count; //初值&#xff0c;定时为10ms TIFR0x01; //清中断标志…

【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

在单片机开发中&#xff0c;UART、I2C、RS485等普遍在用&#xff0c;这里做一个简单的介绍 UART通用异步收发器 UART口指的是一种物理接口形式(硬件)。 UART是异步&#xff08;指不使用时钟同步&#xff0c;依靠帧长进行判断&#xff09;&#xff0c;全双工&#xff08;收发…

比较器的工作原理及性能指标介绍

一、什么是比较器 比较器的功能是比较两个或更多数据项&#xff0c;以确定它们是否相等&#xff0c;或者确定它们之间的大小关系和排列顺序&#xff0c;这称为比较。可以实现此比较功能的电路或设备称为比较器。比较器是将模拟电压信号与参考电压进行比较的电路。比较器的两个…