• 分布式事务理论基础之初识Seata


    分布式事务理论基础

    CAP定理:

    • Consistency(一致性):用户在访问分布式系统中的任意节点,得到的数据必须一致
    • Availablity(可用性):用户访问集群中的任意健康节点,必须能得到响应,而不是超时或者拒绝
    • Partiton tolerance(分区容错性):分区: 因为故障或者其他原因导致分布式中的部分节点与其他节点失去连接,形成独立分区 ,容错:在集群中出现分区时,整个系统也要持续对外提供服务

    分布式无法同时满足这三个指标

    BASE理论:

    是对CAP的一种解决思路,包含三个思想:

    Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。

    Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态

    Eventually Cionsistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致

    Seata架构

    Seate事务管理中有三个重要的角色:

    TC(事务协调者):维护全局和分支事务的状态,协调全局事务的提交或者回滚

    TM(事务管理器):定义全局事务的范围、开始全局事务、提交或回滚全局事务

    RM(资源管理器):管理分支事务处理的资源、与TC交谈以注册事务和报告分支事务的状态,并驱动分支事务提交或回滚

    部署TC服务

    首先我们要下载seata-server包,地址在http😕/seata.io/zh-cn/blog/download.html

    2.解压

    在非中文目录解压缩这个zip包,其目录结构如下:

    在这里插入图片描述

    3.修改配置

    修改conf目录下的registry.conf文件:

    在这里插入图片描述

    内容如下:

    registry {
      # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
      type = "nacos"
    
      nacos {
        # seata tc 服务注册到 nacos的服务名称,可以自定义
        application = "seata-server"
        serverAddr = "127.0.0.1:8848"
        group = "DEFAULT_GROUP"
        namespace = ""
        cluster = "SH"
        username = "nacos"
        password = "nacos"
      }
    }
    
    config {
      # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
      type = "nacos"
      # 配置nacos地址等信息
      nacos {
        serverAddr = "127.0.0.1:8848"
        namespace = ""
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos"
        dataId = "seataServer.properties"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4.在nacos添加配置

    特别注意,为了让tc服务的集群可以共享配置,我们选择了nacos作为统一配置中心。因此服务端配置文件seataServer.properties文件需要在nacos中配好。

    格式如下:

    在这里插入图片描述

    配置内容如下:

    # 数据存储方式,db代表数据库
    store.mode=db
    store.db.datasource=druid
    store.db.dbType=mysql
    store.db.driverClassName=com.mysql.cj.jdbc.Driver
    store.db.url=jdbc:mysql://127.0.0.1:3306/seata?serverTimezone=UTC&useUnicode=true&rewriteBatchedStatements=true
    store.db.user=root
    store.db.password=20020630
    store.db.minConn=5
    store.db.maxConn=30
    store.db.globalTable=global_table
    store.db.branchTable=branch_table
    store.db.queryLimit=100
    store.db.lockTable=lock_table
    store.db.maxWait=5000
    # 事务、日志等配置
    server.recovery.committingRetryPeriod=1000
    server.recovery.asynCommittingRetryPeriod=1000
    server.recovery.rollbackingRetryPeriod=1000
    server.recovery.timeoutRetryPeriod=1000
    server.maxCommitRetryTimeout=-1
    server.maxRollbackRetryTimeout=-1
    server.rollbackRetryTimeoutUnlockEnable=false
    server.undo.logSaveDays=7
    server.undo.logDeletePeriod=86400000
    
    # 客户端与服务端传输方式
    transport.serialization=seata
    transport.compressor=none
    # 关闭metrics功能,提高性能
    metrics.enabled=false
    metrics.registryType=compact
    metrics.exporterList=prometheus
    metrics.exporterPrometheusPort=9898
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息。

    5.创建数据库表

    特别注意:tc服务在管理分布式事务时,需要记录事务相关数据到数据库中,你需要提前创建好这些表。

    新建一个名为seata的数据库

    这些表主要记录全局事务、分支事务、全局锁信息:

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- 分支事务表
    -- ----------------------------
    DROP TABLE IF EXISTS `branch_table`;
    CREATE TABLE `branch_table`  (
      `branch_id` bigint(20) NOT NULL,
      `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `transaction_id` bigint(20) NULL DEFAULT NULL,
      `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `status` tinyint(4) NULL DEFAULT NULL,
      `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `gmt_create` datetime(6) NULL DEFAULT NULL,
      `gmt_modified` datetime(6) NULL DEFAULT NULL,
      PRIMARY KEY (`branch_id`) USING BTREE,
      INDEX `idx_xid`(`xid`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- 全局事务表
    -- ----------------------------
    DROP TABLE IF EXISTS `global_table`;
    CREATE TABLE `global_table`  (
      `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `transaction_id` bigint(20) NULL DEFAULT NULL,
      `status` tinyint(4) NOT NULL,
      `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `timeout` int(11) NULL DEFAULT NULL,
      `begin_time` bigint(20) NULL DEFAULT NULL,
      `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `gmt_create` datetime NULL DEFAULT NULL,
      `gmt_modified` datetime NULL DEFAULT NULL,
      PRIMARY KEY (`xid`) USING BTREE,
      INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
      INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    6.启动TC服务

    进入bin目录,运行其中的seata-server.bat即可:

    在这里插入图片描述

    启动成功后,seata-server应该已经注册到nacos注册中心了。

    打开浏览器,访问nacos地址:http://localhost:8848,然后进入服务列表页面,可以看到seata-tc-server的信息:

    在这里插入图片描述

    微服务继承Seata

    1.引入依赖

     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
      <!--版本较低,1.3.0,因此排除-->
         <exclusions>
         <exclusion>
             <artifactId>seata-spring-boot-starter</artifactId>
             <groupId>io.seata</groupId>  </exclusion>
          </exclusions>
          </dependency>
     <!--seata starter 采用1.4.2版本-->
    
     <dependency>
         <groupId>io.seata</groupId>
        <artifactId>seata-spring-boot-starter</artifactId>
        <version>${seata.version}</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.配置文件

    seata:
      registry:
        type: nacos
        nacos:
          server-addr: 127.0.0.1:8848
          namespace: ""
          group: DEFAULT_GROUP
          application: seata-server
          username: nacos
          password: nacos
      tx-service-group: seata-demo
      service:
        vgroup-mapping: #事务组与Cluster的关系
          seata-demo: SH
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    图文详解!带你认识 ancert:硬件兼容性标准实现工具!| 龙蜥技术
    Python文件操作和管理指南:打开、读取、写入和管理文件
    Mac上的utools无法找到本地搜索插件
    centos离线安装包(https部署下需要mod_ssl)
    centos7.6 MySQL 5.5 主从同步配置
    线性代数-矩阵的逆
    Zookeeper、Nginx错误集
    mysql 注入之权限
    推荐计划为什么有效?需要推荐计划的10个原因
    《Effective C++》条款23
  • 原文地址:https://blog.csdn.net/qq_57907966/article/details/126612922