首页 > 其他分享 >分布式事务~seata的使用

分布式事务~seata的使用

时间:2023-12-04 17:23:46浏览次数:37  
标签:事务 seata nacos 分布式 order NULL id stock

springcloud-nacos-seata

分布式事务组件seata的使用demo,AT模式,集成nacos、springboot、springcloud、mybatis-plus,数据库采用mysql

demo中使用的相关版本号,具体请看代码。如果搭建个人demo不成功,验证是否是由版本导致,由于目前这几个项目更新比较频繁,版本稍有变化便会出现许多奇怪问题

  • seata 1.4.2
  • spring-cloud-alibaba-seata 2.1.0.RELEASE
  • spring-cloud-starter-alibaba-nacos-discovery 0.2.1.RELEASE
  • springboot 2.0.6.RELEASE
  • springcloud Finchley.RELEASE

1. 服务端配置

1.1 Nacos-server

版本为nacos-server-2.0.4,demo采用本地单机部署方式,请参考 Nacos 快速开始

1.2 Seata-server

seata-server为release版本1.4.2,demo采用本地单机部署,从此处下载 https://github.com/seata/seata/releases
并解压

1.2.1 修改conf/registry.conf 配置

设置type、设置serverAddr为你的nacos节点地址。

注意这里有一个坑,serverAddr不能带‘http://’前缀

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    serverAddr = "127.0.0.1"
    namespace = ""
    cluster = "default"
  }
}
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"
  nacos {
    serverAddr = "127.0.0.1"
    namespace = ""
    cluster = "default"
  }
}

1.2.2 修改conf/nacos-config.txt 配置

service.vgroup_mapping.${your-service-gruop}=default,中间的${your-service-gruop}为自己定义的服务组名称,服务中的application.properties文件里配置服务组名称。

demo中有两个服务,分别是stock-service和order-service,所以配置如下

service.vgroup_mapping.stock-service-group=default
service.vgroup_mapping.order-service-group=default

** 注意这里,高版本中应该是vgroupMapping 同时后面的如: order-service-group 不能定义为 order_service_group**

1.3 启动seata-server

分两步,如下

# 初始化seata 的nacos配置
cd conf
sh nacos-config.sh 127.0.0.1

# 启动seata-server
cd bin
sh seata-server.sh -p 8091 -m file

2. 应用配置

2.1 数据库初始化

-- 创建 order库、业务表、undo_log表
create database seata_order;
use seata_order;

DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;


-- 创建 stock库、业务表、undo_log表
create database seata_stock;
use seata_stock;

DROP TABLE IF EXISTS `stock_tbl`;
CREATE TABLE `stock_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;

-- 初始化库存模拟数据
INSERT INTO seata_stock.stock_tbl (id, commodity_code, count) VALUES (1, 'product-1', 9999999);
INSERT INTO seata_stock.stock_tbl (id, commodity_code, count) VALUES (2, 'product-2', 0);

2.2 应用配置

见代码

几个重要的配置

  1. 每个应用的resource里需要配置一个registry.c ,demo中与seata-server里的配置相同
  2. application.propeties 的各个配置项,注意spring.cloud.alibaba.seata.tx-service-group 是服务组名称,与nacos-config.txt
    配置的service.vgroup_mapping.${your-service-gruop}具有对应关系

3. 测试

  1. 分布式事务成功,模拟正常下单、扣库存

    localhost:9091/order/placeOrder/commit

  2. 分布式事务失败,模拟下单成功、扣库存失败,最终同时回滚

    localhost:9091/order/placeOrder/rollback

相关代码

order模块

    /**
     * 下单:创建订单、减库存,涉及到两个服务
     *
     * @param userId
     * @param commodityCode
     * @param count
     */
    @GlobalTransactional
    @Transactional(rollbackFor = Exception.class)
    public void placeOrder(String userId, String commodityCode, Integer count) {
        BigDecimal orderMoney = new BigDecimal(count).multiply(new BigDecimal(5));
        Order order = new Order().setUserId(userId).setCommodityCode(commodityCode).setCount(count).setMoney(
            orderMoney);
        orderDAO.insert(order);
        stockFeignClient.deduct(commodityCode, count);

    }

stock模块

    /**
     * 减库存
     *
     * @param commodityCode
     * @param count
     */
    @Transactional(rollbackFor = Exception.class)
    public void deduct(String commodityCode, int count) {
        if (commodityCode.equals("product-2")) {
            throw new RuntimeException("异常:模拟业务异常:stock branch exception");
        }

        QueryWrapper<Stock> wrapper = new QueryWrapper<>();
        wrapper.setEntity(new Stock().setCommodityCode(commodityCode));
        Stock stock = stockDAO.selectOne(wrapper);
        stock.setCount(stock.getCount() - count);

        stockDAO.updateById(stock);
    }

标签:事务,seata,nacos,分布式,order,NULL,id,stock
From: https://www.cnblogs.com/lori/p/17875453.html

相关文章

  • LAXCUS分布式操作系统的产品规划和发展阶段​
    又是一位网友的提问,把回答贴出来给大家看看,欢迎大家在下方留言交流。问:关注你们很久了,我想问一问,Laxcus分布式操作系统有没有具体的产品规划,如果有是什么,打算怎么做?你们的主要着眼点在哪里?目前Laxcus分布式操作系统发展到什么阶段了?答:感谢关注!Laxcus做为全球第一款纯粹的分布式操......
  • 对Laxcus分布式操作系统的认知、价值、痛点解决的回答​
    下面是一位网友的提问,回答贴出来供大家参考,欢迎在下方留言评论。问:Laxcus分布式操作系统有哪些与众不同的地方?它的价值在哪里?解决了哪些市场痛点?我公司现在已经使用Linux操作系统部署了一堆服务器,你如何说服我弃用Linux使用Laxcus?回答:Laxcus分布式操作系统是操作系统的一个异类,它是......
  • 分布式数据库Apache Doris HA集群部署
    ......
  • 使用分布式事务 Seata 的 XA 模式
    上篇博客已经搭建了分布式事务Seata的集群,本篇博客主要介绍如何使用Seata的XA模式。XA模式的规范是X/Open组织定义的分布式事务处理(DTP,DistributedTransactionProcessing)标准,XA模式规范描述了全局的TM与局部的RM之间的接口,几乎所有主流关系型数据库都对XA模式......
  • SAP ABAP RZ11 事务码里 Instance Profile 和 Current Value 等参数值的解读
    首先,让我们了解在SAPABAP系统中通过事务码RZ11查看参数时,涉及的四个重要组件:KernelDefault、DefaultProfile、InstanceProfile和CurrentValue。KernelDefault:含义:KernelDefault表示系统中SAP内核(Kernel)的默认配置参数值。这是SAP系统内核的全局默认设置,通常在SAP系统......
  • SAP ABAP 系统里事务码 SMICM 的作用
    "SMICM"是SAP系统中的一个事务码,用于管理和监控SAP系统的通信管理。这个事务码的全名是"ICMMonitor",其中"ICM"代表"InternetCommunicationManager"。SMICM提供了一系列功能,帮助管理员监视和维护SAP系统的通信基础设施。SMICM的主要作用:监控服务和端口:SMICM......
  • SAP ABAP 系统里的事务码 SMICM keep Alive 参数的作用
    SMICM截图如下:SAPABAP系统中的事务码SMICM是用来访问InternetCommunicationManager(ICM)的监视。ICM是SAP系统中负责HTTP、SMTP、或者HTTPS通信的组件。在SMICM事务中,你可以看到关于ICM的各种信息,例如线程信息、服务信息、连接信息和缓存信息等。在服务列......
  • 事务码 RZ11 对 SAP ABAP 系统管理员( Basis )的作用
    SAPABAP系统中的事务码RZ11是一个非常重要的工具,它主要用于显示和维护SAP系统的参数。这些参数影响了SAP系统的运行,包括内存管理,数据库交互,安全性设置等。RZ11提供了一种方法,允许管理员或开发者查看和修改这些参数,以便调整系统的运行方式,以满足特定的需求或优化性能。例......
  • SAP ABAP 系统事务码 RZ11 的作用
    事务码"RZ11"在SAPABAP系统中是一个非常重要的工具,它主要用于动态参数的维护和查询。通过"RZ11",用户可以查看系统中所有的动态参数及其相关信息,同时也可以修改这些参数的取值。在SAP系统中,动态参数是一种能够在运行时调整的系统参数,这些参数的修改无需停机,可以在系统运行......
  • SAP ABAP 系统里的事务码 SMICM keep Alive 参数的含义和配置
    在SAPABAP系统中,事务码SMICM(SystemManagementInterfaceforCommunicationManagement)是一个用于管理通信的工具,通过它可以监视和配置与SAP系统相关的通信参数。SMICM提供了对SAP实例通信管理的集中控制,用户可以通过该事务码查看和配置多个通信参数,确保系统的正常运行。在SMIC......