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

这篇具有很好参考价值的文章主要介绍了分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

正文

1、解决的应用场景是分布式事务,每个服务有独立的数据库。
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

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

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

下载

seata下载地址

seata的配置

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

分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

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步后,启动
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式
就会发现nacos注册上了seata
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

项目的代码

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

A服务的方法:
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式
B服务的方法:
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式
B服务的方法正常执行并提交数据到B库,但是A服务报错了,所以B服务得回滚数据

A、B的Application都要加上@EnableAutoDataSourceProxy
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

注意:引入的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服务的控制台输出:
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

B服务的控制台输出:
分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos),后端,高可用架构,JAVA,数据库,分布式

备注

如果因为nacos的配置文件过大,导致netty报错,那么,就修改netty的内存,文件是application.yml文章来源地址https://www.toymoban.com/news/detail-681728.html

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

到了这里,关于分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

    本文旨在介绍 OceanBase 4.1 版本的特点、更新内容和初体验,帮助读者了解和掌握这个开源分布式关系型数据库管理系统。如果你对大规模数据存储和处理的挑战感兴趣,或者正在寻找一种满足互联网领域高并发、高可靠性和高扩展性要求的数据库解决方案,本文将为你提供有

    2024年02月05日
    浏览(37)
  • 软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现

    软考高级系统架构设计师系列之:分布式存储技术

    2024年02月11日
    浏览(38)
  • 软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

    软考高级系统架构设计师系列之:分布式存储技术

    2024年02月10日
    浏览(36)
  • 分布式数据库架构

    对于mysql架构,一定会使用到读写分离,在此基础上有五种常见架构设计:一主一从或多从、主主复制、级联复制、主主与级联复制结合。 1.1、主从复制 这种架构设计是使用的最多的。在读写分离的基础上,会存在一台master作为写机,一个或多个slave作为读机。因为在实际的

    2024年02月10日
    浏览(33)
  • 分析型数据库:分布式分析型数据库

    分析型数据库的另外一个发展方向就是以分布式技术来代替MPP的并行计算,一方面分布式技术比MPP有更好的可扩展性,对底层的异构软硬件支持度更好,可以解决MPP数据库的几个关键架构问题。本文介绍分布式分析型数据库。 — 背景介绍— 目前在分布式分析型数据库领域,

    2023年04月14日
    浏览(43)
  • 分布式数据库HBase

    HBase是一个高可靠、高性能、 面向列 、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和把结构化的松散数据。 HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用 廉价计算机集群 处理由超过10亿行数据和数百万列元素组成的数据表。

    2024年02月09日
    浏览(44)
  • 【大数据】分布式数据库HBase

    目录 1.概述 1.1.前言 1.2.数据模型 1.3.列式存储的优势 2.实现原理 2.1.region 2.2.LSM树 2.3.完整读写过程 2.4.master的作用 本文式作者大数据系列专栏中的一篇文章,按照专栏来阅读,循序渐进能更好的理解,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm=1001.2014.3001.5482 当

    2024年04月27日
    浏览(30)
  • 分布式数据库-事务一致性

    version: v-2023060601 author: 路__ 分布式数据库的“强一致性”应该包含两个方面: serializability(串行) and linearizability(线性一致) ,上述图为“Highly Available Transactions: Virtues and Limitations”论文中对于一致性模型的介绍。图中箭头表示一致性模型之间的关系。对于异步网络上的分

    2024年02月08日
    浏览(37)
  • 分布式数据库NoSQL(二)——MongoDB 数据库基本操作

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的

    2024年02月06日
    浏览(32)
  • 11.云原生分布式数据库之TIDB

    云原生专栏大纲 从后端视角、运维视角和基础架构视角来看,使用 TiDB 作为数据库系统可以获得分布式架构、高可用性、强一致性、事务支持、水平扩展、高性能、简化运维、灵活的扩展和配置、集成的监控和告警等优势。这些优势使得 TiDB 成为处理大规模数据和高并发请求

    2024年02月01日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包