Seata 学习笔记

目录

安装步骤:

到官网自行下载:
官网

数据库的准备

部署教程
就简单的说 你需要 在数据库 建个seata 库 里面存放的是到时候需要回滚的一些数据
sql脚本
还需要在你需要回滚的数据库创建一个 undo 表 进行回滚操作:
undo sql

配置文件的修改

你需要修改的配置文件:
Seata 学习笔记
分别修改 注册和存储的:
很简单的 列如 file.conf 的修改:
Seata 学习笔记
第一行表示要用什么来存储

然后选择db 代表数据库 再把db 对应的那些修改成自己的数据即可:
Seata 学习笔记
register.conf 一样:
注意里面有两处type 都需要修改:
Seata 学习笔记
Seata 学习笔记
以上便是使用前的准备

开始使用

1:启动nacos 与seata 服务

由于使用到了 nacos 进行注册 所以需要使用nacos进行搭配
启动很简单 打开bin目录的bat文件即可:
注意先启动好nacos
Seata 学习笔记

2:微服务的建立

此次用到的测试 有三个微服务三个数据库:
订单 用户 库存
就很简单 下订单 生成订单 扣用户金额 减少库存

步骤

1: 改pom:

 <dependencies>
        <!--nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--seata-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>seata-all</artifactId>
                    <groupId>io.seata</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-all</artifactId>
            <version>1.4.1</version> <!--最好改成自己在官网下载的那个版本-->
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

2:改yaml: 基本上没什么好改的

server:
  port: 2002

spring:
  application:
    name: seata-storage-service
  cloud:
    alibaba:
#      seata:
#        tx-service-group: fsp_tx_group  分组的设置
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/seata_storage
    username: root
    password: 1234

logging:
  level:
    io:
      seata: info

mybatis:
  mapperLocations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true

3:需要在resources 下把配置文件复制进来
Seata 学习笔记

3:测试

在你需要回滚的事务的 controller或者serviceimple 的方法上 写上这个注解就完事了:

@GlobalTransactional

Seata 学习笔记
一些参数的解释:
name :就是name
剩下的解释就知道

Seata 学习笔记

补充:(持续更新)

整体的流程:

Seata 学习笔记
关于 tm tc rm 的解释 :大概就是这样
Seata 学习笔记

回滚原理

Seata 学习笔记
这是 第一阶段的操作 最主要的就是 这个before 和 after 快照
Seata 学习笔记
这是发生了回滚进行的操作
具体可以用列子进行解释:
Seata 学习笔记

如图 我在进行数据的修改之前 先走第一阶段的流程
保存一个before 快照 存储了age=22
然后 进行修改 age =28
随后 又建立了after 快照 存储了 age=28
到此 第一阶段结束

如果发生事务回滚
他首先去查 数据库 age为多少
如果age=28 那和 after快照存储的age对比 一样
那就进行设置 把before快照存储的age 值 设置进去
如果 age!=28 而after 是28 那证明出现了脏读
则会转到人工处理

上一篇:微服务*项目(25) -分布式事务(SEATA)


下一篇:Spring Cloud Seata你了解多少