SpringCloud - seata

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. 解压到指定目录,并修改conf下的file.conf配置文件(先备份配置文件,防止玩坏)

  3. 主要修改:自定义事务租名称+事务日志存储模式为db+数据库连接信息
    在这里插入图片描述
    在这里插入图片描述

  4. 修改registry.conf
    在这里插入图片描述

  5. 建库seata、建表
    在这里插入图片描述

测试

新建seata-account-service2001、seata-order-service2002、seata-storage-service2003

application.yml

server:
  port: 2003
spring:
  application:
    name: seata-account-service
  cloud:
    alibaba:
      seata:
        tx-service-group: wangyh #file.conf 的组名
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/seata-account?serverTimezone=UTC&characterEncoding=utf-8
    username: root
    password: 123456
feign:
  hystrix:
    enabled: false

mybatis:
  mapper-locations: classpath:mapper/*.xml
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
   <exclusions>
       <exclusion>
           <groupId>seata-all</groupId>
           <artifactId>io.seata</artifactId>
       </exclusion>
   </exclusions>
</dependency>
<dependency>
   <groupId>io.seata</groupId>
   <artifactId>seata-all</artifactId>
   <version>0.9.0</version>
</dependency>

将seata配置文件复制到项目中
在这里插入图片描述
修改file.conf 将31行处修改成组名
在这里插入图片描述
服务层

 @GlobalTransactional(name = "order-insert",rollbackFor = Exception.class)
 public void insertOrder(Order order){
     System.out.println("----------------下订单");
     orderDao.insert(order);
     System.out.println("-----------------减库存");
     storageService.decr(order.getPid(),order.getAccount());
     System.out.println("-----------------减余额");
     accountService.decr(order.getUid(),order.getPrice());
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值