07 微服务组件 - Seata分布式事务

128 阅读3分钟

写在最前面: image.png


1. 事务介绍

image.png

1.1 本地事务

image.png

1.2 分布式事务

image.png

分布式事务典型场景:
1.跨库事务:一个应用某个功能需要操作多个库,不同的库中存储不同的业务数据;
2.分库分表:一个库数据量比较大或者预期未来的数据量比较大,都会进行水平拆分;
3.服务化:一个订单支付功能调用多个服务,每个服务有不同的数据库操作,同时成功或失败。

2. 常见的分布式解决方案

image.png

2.1 两阶段提交协议2PC

解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。目前绝大多数分布式解决方案都是以两阶段提交协议2PC为基础的

2PC(两阶段提交,Two-Phase Commit) image.png

2.2 AT、TCC、Saga、XA 的4种分布式事务实现

image.png

2.2.1 AT模式

image.png AT模式如何做到对业务的无侵入image.png image.png image.png

2.2.2 TCC模式

image.png image.png

蚂蚁金服TCC实践设计image.png image.png image.png image.png image.png image.png

3. Seata是什么?

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA 事务模式,为用户打造一站式的分布式解决方案。

Seata-快速启动

3.1 Seata的三大角色

image.png

4. Seata AT模式原理

详见:Seata AT 模式

image.png image.png image.png image.png image.png image.png image.png

4.1 设计亮点

image.png

4.2 存在的问题

image.png

5. Seata快速开始

Seata新手部署指南

image.png image.png

5.1 db数据源配置

  1. 下载seata项目包,github.com/seata/seata…
  2. 打开config/file.conf文件,修改mode="db",修改数据库连接信息;image.png
  3. 新建数据库seata_server,执行sql脚本创建global_table、branch_table和lock_table表:github.com/seata/seata… image.png

5.2 nacos配置

  1. 将Seata Server注册到Nacos,修改conf目录下的registry.conf配置;image.png
  2. 获取/seata/script/config-center/config.txt,修改配置信息,配置信息同步到nacos;image.png
  3. 启动Seata,支持的启动参数:image.png sh seata-server.sh -p 8091 -n 1 ; sh seata-server.sh -p 8092 -n 2 ; sh seata-server.sh -p 8093 -n 3 ; image.png

5.3 接入微服务应用

image.png

  1. 启动Seata server端,使用nacos作为配置中心和注册中心;(上面已完成)
  2. 添加pom依赖:
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    </dependency>
    
  3. 各微服务order、stock对应数据库中添加undo_log表:github.com/seata/seata…
    CREATE TABLE IF NOT EXISTS `undo_log`
    (
        `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
        `xid`           VARCHAR(128) 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 = utf8mb4 COMMENT ='AT transaction mode undo table';
    
  4. 修改application配置:
    # seata config配置:可以读取seataClient的一些配置
    seata.config.type=nacos
    seata.config.nacos.server-addr=192.168.1.7:8849
    seata.config.nacos.group=SEATA_GROUP
    seata.config.nacos.username=nacos
    seata.config.nacos.password=nacos
    
  5. 微服务发起者(TM 方)需要添加@GlobalTransactional注解image.png
  6. 测试:下单成功,正常写入订单纪录和扣库存;下单异常,无写入订单纪录和扣库存纪录。

6.Seata运行原理总结

image.png

生命周期:

  1. 一进入事务方法中就生成全局事务XID:image.pngimage.png

  2. 运行数据库操作方法,纪录事务参与者,生成undo_log日志,生成行锁:image.pngimage.pngimage.pngimage.pngimage.pngimage.png

  3. 全局事务提交。

充分说明了分布式解决方案,能不用就不用!!! image.png