微服务-分布式事务-seata

1. 事务

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作,这些操作作为一个整体一起向系统提交,要么执行,要么都不执行

1.1 ACID事务的特点

原子性:针对同一事务,要么都完成,要么都不完成

一致性:事务前后的数据完整性要保持一致

隔离性:针对多个用户同时操作,主要是排除其他事务对本次事务的影响

持久性:事务一旦提交就不可逆,被持久化到数据库中

1.2 事务并发带来的问题

脏读:读取了其他事务未提交的数据

幻读:两次读取的数量不一样。【对应插入或删除操作】幻读是不可重复读的一种特殊场景

不可重复读:两次读取的内容不一样。【对应的是修改,即update操作】

1.3 解决问题

读未提交:读取未提交的数据

读已提交:一个事务只能看见已经提交事务所做的改变

可重复读: 在开始读取数据(事务开启)时,不再允许修改操作 。这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。

串行化:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

2. 分布式事务

不同的微服务连接不同的数据库

2.1 如何解决分布式问题-seata

第一种:可以自己通过代码解决分布式事务【自研公司】

第二种:借助rabbitmq来解决

第三种:借助alibaba的seata来解决【使用阿里的】

2.2 介绍seata

网站:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

Seata是一款开源的分布式事务解决方案组件。致力于提供高性能和简单易用的分布式事务服务

Seata将为用户提供了AT(我们采用)、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案

seata的执行流程如下:

  1. A服务【订单微服务】的TM【事务发起者】向TC【seata服务端】申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID
  2. A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播
  3. B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
  4. B服务执行分支事务,向数据库做操作
  5. 全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚
  6. TC协调其管辖之下的所有分支事务,决定是否回滚

TM:事务发起者【在哪个微服务的方法上添加了全局事务注解,哪个微服务就是TM】

TC:事务管理器【seata的服务端】

RM:每个操作数据库的微服务

XID:全局事务id

2.3 搭建seata服务器

  1. 下载seata1.3.0

    下载地址:https://github.com/seata/seata/releases/tag/v1.3.0

  2. 解压

  3. 修改conf/file.conf配置文件

    让seata集群信息可以共享,我们应该修改它的保存位置:默认保在本地文件。可以让seata集群保存到mysql数据库


    文件内其余的均可以选择删除

  4. 根据自己的数据库选择对应的数据库jar包将其放入到上一级目录------lib目录

  5. 创建数据库【命名为seata】


    并将下方目录位置的表结构导入seata数据库

  • 首先要下载seata源码包,将源码包中的script目录导入解压后的seata目录中

  • 选择script目录下的db目录下的表

  1. 修改conf/registry.conf文件


    打卡开该文件后,做下面图示的修改


该文件的其余内容均可以选择删除
7. 修改config.txt文件,设置将哪些配置项放入nacos配置中心

该文件指定配置中心【nacos】的内容


打开该文件做下图所示的修改



8. 使用nacos/nacos-config.sh把配置信息当入nacos配置中心

打开下面页面


需要启动的文件为shell脚本,需要借助git打开

在上图页面,点击右键------git界面------执行./nacos-config.sh命令
9. 启动seata服务器,注意:启动seata服务器前,必须启动nacos

一般在企业中,已经搭建好了

2.4 配置微服务客户端

  1. 在每个微服务数据库中创建unlog表,日志表:记录着数据提交的内容。当出现异常,回滚到日志记录的内容

    sql 复制代码
    -- for AT mode you must to init this sql for you business database. theseata server not need it.
    CREATE TABLE IF NOT EXISTS `undo_log`
    (
    `branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
    `xid` VARCHAR(100) NOT NULL COMMENT 'global transaction id',
    `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as
    serialization',
    `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
    `log_status` INT(11) NOT NULL COMMENT '0:normal
    status,1:defense status',
    `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
    `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    ) ENGINE = InnoDB
    AUTO_INCREMENT = 1
    DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';
  1. 在每个微服务中添加seata依赖

    xml 复制代码
    <!--seata依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            </dependency>
  1. 修改每个微服务的配置文件

    yml 复制代码
    # 把该服务注册到nacos上
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        alibaba:
          seata:
            tx-service-group: zmq
    
    # 配置mybatis映射文件的路径
    mybatis:
      mapperLocations: classpath:mapper/*.xml
    # 显示mybatis执行的sql语句
    logging:
      level:
        com.ykq.dao: debug
    seata:
      registry:
        type: nacos
        nacos:
          server-addr: localhost:8848
          username: nacos
          password: nacos
          group: SEATA_GROUP
          application: seata-server
      config:
        type: nacos
        nacos:
          server-addr: localhost:8848
          username: nacos
          password: nacos
          group: SEATA_GROUP


  2. 在事务的发起者【TM】的方法上添加全局事务注解@GlobalTransactional

相关推荐
pan30350747911 小时前
Kafka 和 RabbitMQ的选择
分布式·kafka·rabbitmq
hzulwy13 小时前
Kafka基础理论
分布式·kafka
明达智控技术14 小时前
MR30分布式IO在全自动中药煎药机中的应用
分布式·物联网·自动化
jakeswang15 小时前
细说分布式ID
分布式
LQ深蹲不写BUG16 小时前
微服务的保护方式以及Sentinel详解
微服务·云原生·架构
失散1316 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
王中阳Go17 小时前
头一次见问这么多kafka的问题
分布式·kafka
鼠鼠我捏,要死了捏17 小时前
基于Apache Flink Stateful Functions的事件驱动微服务架构设计与实践指南
微服务·apache flink·实时处理
boonya18 小时前
Kafka核心原理与常见面试问题解析
分布式·面试·kafka
KIDAKN20 小时前
RabbitMQ 重试机制 和 TTL
分布式·rabbitmq