Seata 是什么

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

分布式事务处理过程的一ID+三个组件模型

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

处理过程

  1. TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID;
  2. XID在微服务调用链的上下文中传播;
  3. RM向TC注册分支事务,将其纳入XID对应全局事务的管辖;
  4. TM向TC发起针对XID的全局提交或回滚决议;
  5. TC调度XID下管辖的全部分支事务完成提交或回滚请求。
    调度过程

seata安装过程

  1. https://github.com/seata/seata/releases
  2. 当前seata版本1.6.1
  3. 解压到指定目录
  4. Server 端存储模式(store.mode)支持三种:
    file:(默认) 单机模式,全局事务会话信息在内存中读写并持久化本地文件root.data,性能较高(默认)
    db:高可用模式,全局事务会话信息通过 db 共享,相应性能差些
    redis:Seata-Server 1.3 及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的 redis 持久化配置
  5. 修改/seata/conf/application.yml
    5.1 seata.store 将mode改为db,并且修改数据库信息
    在这里插入图片描述
    5.2 创建seata数据库。执行seata\script\server\db\mysql.sql文件。创建表.
    5.3 修改seata.registry,将type改为nacos,并且修改nacos信息,将seata服务注册到nacos中。
    5.4 修改seata.config,将type改为nacos,并且修改nacos信息。seata默认配置用的是\seata\script\config-center\config.txt的配置信息
    5.5 修改\seata\script\config-center\config.txt
    在这里插入图片描述
    注意 :service.vgroupMapping.default_tx_group=default
    在这里插入图片描述

这个主要用于集群分组,比如:有3个seata服务,分别部署在上海、广州、北京。这个配置可以分别改成:
service.vgroupMapping.guangzhou=default
service.vgroupMapping.beijing=default
service.vgroupMapping.shanghai=default。
上海的seata服务器突然挂了,可以修改配置文件直接切换成广州。这个配置最终会在服务yml文件中配置如下

spring:
    alibaba:
      seata:
      	  # 对应service.vgroupMapping.  default_tx_group
        tx-service-group: default_tx_group

service.vgroupMapping.default_tx_group=default中的default对应/seata/conf/application.yml中的registry.nacos.cluster
在这里插入图片描述
5.6 执行\seata\script\config-center\nacos\nacos-config.sh 将\seata\script\config-center\config.txt配置信息上传到nacos配置中心就可以了,要用nacos管理配置
5.7 在需要分布式事务的所有数据库中新增一个undo_log表

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 DEFAULT CHARSET=utf8;

在这里插入图片描述

测试

建两个服务。
在这里插入图片描述
两个服务导入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

修改两个服务的application.yml 新增配置如下:

spring:
  cloud:
    #配置nacos
    nacos:
      server-addr: 127.0.0.1:8848
    alibaba:
      seata:
        # 对应service.vgroupMapping.  default_tx_group
        tx-service-group: default_tx_group

seata:
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      application: seata-server
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      application: seata-server
      group: SEATA_GROUP

注解:@GlobalTransactional
用order-server服务通过openfeign调用product-server。加上@GlobalTransactional注解。

@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderDo> implements OrderService {

    @Resource
    private ProductFeign productFeign;

    @Override
    @GlobalTransactional
    @Transactional
    public String createOrder(Integer userId, Integer pid, Integer total) {
        OrderDo order = new OrderDo();
        order.setCount(total);
        order.setStorageId(pid);
        baseMapper.insert(order);
//
        log.info("扣减余额:"+Thread.currentThread().getName());

        productFeign.deduct(pid, total);
        int i = 1/0;
        return "新增订单成功";

    }

}

最终调用结果就是order-server抛出异常,product-server数据同时回滚。实现分布式事务

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐