• Seata 分布式事务框架


    1、简介

            Seata 是一款开源的分布式事务框架。致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各业务单元业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。

      Seata:https://seata.io/zh-cn/index.html

    发展史 

    seata的github地址:https://github.com/seata/seata 

     

    2、特色功能

    1. 微服务框架支持:目前已支持 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持续集成中
    2. AT 模式:提供无侵入自动补偿的事务模式,目前已支持 MySQL、 Oracle 、PostgreSQL和 TiDB的AT模式,H2 开发中
    3. TCC 模式:支持 TCC 模式并可与 AT 混用,灵活度更高
    4. SAGA 模式:为长事务提供有效的解决方案
    5. XA 模式:支持已实现 XA 接口的数据库的 XA 模式
    6. 高可用:支持基于数据库存储的集群模式,水平扩展能力强

     

    3、Seata 产品模块

            Seata 中有三大模块,分别是 TM、RM 和 TC。其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署。

    TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
    TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
    RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

    在 Seata 中,分布式事务的执行流程: 

    • TM 开启分布式事务, TM会 向 TC 注册全局事务记录;
    • 操作具体业务模块的数据库操作之前, RM 会向 TC 注册分支事务;
    • 当业务操作完事后.TM会通知 TC 提交/回滚分布式事务;
    • TC 汇总事务信息,决定分布式事务是提交还是回滚;
    • TC 通知所有 RM 提交/回滚 资源,事务二阶段结束。

    4、案例引入及问题剖析

    (1)导入lagou_parent工程

    (2) 执行初始化SQL脚本,首先创建4个数据库

        seata_bussiness/seata_order/seata_points/seata_storage,在各自数据库执行SQL脚本

    seata_order数据库 

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
    3. -- Table structure for t_order
    4. -- ----------------------------
    5. DROP TABLE
    6. IF
    7. EXISTS `t_order`;
    8. CREATE TABLE `t_order` (
    9. `id` BIGINT ( 0 ) NOT NULL COMMENT '订单id',
    10. `goods_Id` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品ID',
    11. `num` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品数量',
    12. `money` DECIMAL ( 10, 0 ) NULL DEFAULT NULL COMMENT '商品总⾦额',
    13. `create_time` datetime ( 0 ) NULL DEFAULT NULL COMMENT '订单创建时间',
    14. `username` VARCHAR ( 50 ) CHARACTER
    15. SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '⽤户名称',
    16. PRIMARY KEY ( `id` ) USING BTREE
    17. ) ENGINE = INNODB AUTO_INCREMENT = 49 CHARACTER
    18. SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
    19. -- Records of t_order
    20. -- ----------------------------
    21. SET FOREIGN_KEY_CHECKS = 1;

    seata_points数据库

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
    3. -- Table structure for t_points
    4. -- ----------------------------
    5. DROP TABLE
    6. IF
    7. EXISTS `t_points`;
    8. CREATE TABLE `t_points` (
    9. `id` INT ( 0 ) NOT NULL AUTO_INCREMENT COMMENT '积分ID',
    10. `username` VARCHAR ( 50 ) CHARACTER
    11. SET utf8 COLLATE utf8_bin NOT NULL COMMENT '⽤户名',
    12. `points` INT ( 0 ) NULL DEFAULT NULL COMMENT '⽤户积分',
    13. PRIMARY KEY ( `id` ) USING BTREE
    14. ) ENGINE = INNODB AUTO_INCREMENT = 3 CHARACTER
    15. SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
    16. -- Records of t_points
    17. -- ----------------------------
    18. SET FOREIGN_KEY_CHECKS = 1;

    seata_storage数据库

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
    3. -- Table structure for t_storage
    4. -- ----------------------------
    5. DROP TABLE
    6. IF
    7. EXISTS `t_storage`;
    8. CREATE TABLE `t_storage` (
    9. `id` INT ( 0 ) NOT NULL AUTO_INCREMENT COMMENT '库存ID',
    10. `goods_id` INT ( 0 ) NULL DEFAULT NULL COMMENT '商品ID',
    11. `storage` INT ( 0 ) NULL DEFAULT NULL COMMENT '库存量',
    12. PRIMARY KEY ( `id` ) USING BTREE
    13. ) ENGINE = INNODB AUTO_INCREMENT = 2 CHARACTER
    14. SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
    15. -- Records of t_storage
    16. -- ----------------------------
    17. INSERT INTO `t_storage`
    18. VALUES
    19. ( 1, 1, 100 );
    20. SET FOREIGN_KEY_CHECKS = 1;

    (3)案例测试

        依次将4个服务启动.和nacos服务

    访问路径为:

            http://localhost:8000/test1 正常访问数据分别入库

            http://localhost:8000/test2 访问出错库存不足,导致服务调用失败.则观察数据库, 经发现订单与积分数据库都已改变,而库存数据库没有减少库存, 所以不满足事务的特性

    原始代码下载地址:链接:https://pan.baidu.com/s/1onKBiLQ8x11bPHxxdMv2VQ?pwd=gjc5 

  • 相关阅读:
    ManageEngine 第六次入选 Gartner® 安全信息和事件管理魔力象限™!
    【博客494】K8s TLS Bootstrap机制
    应急响应-Linux常用应急溯源命令
    网络赚钱项目 - 虚拟项目如何选择产品
    .net-----Windows 窗体应用程序包括控件,对话框,多重窗体,绘制图形,菜单和工具栏
    C语言经典100例题(56-60)--画圆;画方;画线
    建模示范视频EA-027/智慧公寓系统试看片段-视频+图片版
    今日头条 小程序
    数据访问 - EntityFramework集成
    【Linux】权限不足的情况下在指定环境运行command
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/126682703