• Seata 分布式事务 详解+使用


    Seata分布式事务详解

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

    也是Spring Cloud Alibaba提供的组件

    Seata官方文档

    https://seata.io/zh-cn/

    更多信息可以通过官方文档获取

    1.为什么需要Seata

    我们之前学习了单体项目中的事务

    使用的技术叫Spring声明式事务@Transactional

    能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性

    但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚

    这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata

    事务的4个特性:ACID特性

    • 原子性
    • 一致性
    • 隔离性
    • 永久性

    Seata保证微服务远程调用业务的原子性

    Seata将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

    2.Seata的运行原理(AT模式)

    观察下面事务模型

    在这里插入图片描述

    上面结构是比较典型的远程调用结构

    如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作

    声明式事务不能完成这个操作

    需要使用Seata来解决

    在这里插入图片描述

    Seata构成部分包含

    • 事务协调器TC
    • 事务管理器TM
    • 资源管理器RM

    我们项目使用AT(自动)模式完成分布式事务的解决

    AT模式运行过程

    1.事务的发起方(TM)会向事务协调器(TC)申请一个全局事务id,并保存

    2.Seata会管理事务中所有相关的参与方的数据源,将数据操作之前和之后的镜像都保存在undo_log表中,这个表是seata组件规定的表**,没有它就不能实现效果,依靠它来实现提交(commit)或回滚(roll back)的操作

    3.事务的发起方(TM)会连同全局id一起通过远程调用运行资源管理器(RM)中的方法

    4.RM接收到全局id,去运行指定方法,并将运行结果的状态发送给TC

    5.如果所有分支运行都正常,事务管理器(TM)会通过事务协调器通知所有模块执行数据库操作,真正影响数据库内容,反之如果有任何一个分支模块运行异常,都会通知TC,再由TC通知所有分支将数据库操作回滚,恢复成运行之前的样子

    AT模式的运行有一个非常明显的前提条件,这个条件不满足,就无法使用AT模式

    这个条件就是事务分支都必须是操作**关系型数据库**(mysql\MariaDB\Oracle)

    因为关系型数据库才支持提交和回滚,其它非关系型数据库都是直接影响数据(例如Redis)

    所以如果我们在业务过程中有一个节点操作的是Redis或其它非关系型数据库时,就无法使用AT模式

    3.Seata的启动

    seata也是java开发的,启动方式和nacos很像

    只是启动命令不同

    它要求配置环境变量中Path属性值有java的bin目录路径

    解压后路径不要用中文,不要用空格

    也是解压之后的bin目录下

    在这里插入图片描述

    在路径上输入cmd进入dos窗口

    D:\tools\seata\seata-server-1.4.2\bin>seata-server.bat -h 127.0.0.1 -m file
    
    • 1

    输入后,最后出现8091端口的提示即可!

    4.使用Seata

    配置Seata

    cart\stock\order三个模块时需要Seata支持进行事务管理的模块

    这三个模块都需要添加下面pom依赖和配置

    
    <dependency>
        <groupId>io.seatagroupId>
        <artifactId>seata-spring-boot-starterartifactId>
    dependency>
    
    <dependency>
        <groupId>com.github.pagehelpergroupId>
        <artifactId>pagehelper-spring-boot-starterartifactId>
    dependency>
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>fastjsonartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下面修改cart\stock\order模块的application-dev.yml

    代码如下

    seata:
      tx-service-group: xxxx  # 定义分组名称,为了与其它项目区分
      service:
        vgroup-mapping:
          xxxx: default       # xxxx分组使用Seata的默认配置完成事务  
        grouplist: 
          default: localhost:8091     # 配置seata的地址和端口号(8091是默认端口号)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意同一个事务必须在同一个tx-service-group中

    同时指定相同的seata地址和端口

    事务触发模块的配置

    事务触发模块作为当前分布式事务模型的触发者

    它应该是事务的起点,但是它不连接数据库,所以配置稍有不同

    pom文件seata依赖仍然需要,但是只需要seata依赖

    <dependency>
        <groupId>io.seatagroupId>
        <artifactId>seata-spring-boot-starterartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    application-dev.yml是一样的

    seata:
      tx-service-group: xxxx# 定义分组名称,为了与其它项目区分
      service:
        vgroup-mapping:
          xxxx: default       # xxxx分组使用Seata的默认配置完成事务  
        grouplist: 
          default: localhost:8091     # 配置seata的地址和端口号(8091是默认端口号)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    5.TCC模式、SAGA模式、XA模式(了解)

    TCC模式

    简单来说,TCC模式就是自己编写代码完成事务的提交和回滚

    在TCC模式下,我们需要为参与事务的业务逻辑编写一组共3个方法

    (prepare\commit\rollback)

    prepare:准备

    commit:提交

    rollback:回滚

    • prepare方法是每个模块都会运行的方法
    • 当所有模块的prepare方法运行都正常时,运行commit
    • 当任意模块运行的prepare方法有异常时,运行rollback

    这样的话所有提交或回滚代码都由自己编写

    优点:虽然代码是自己写的,但是事务整体提交或回滚的机制仍然可用(仍然由TC来调度)

    缺点:每个业务都要编写3个方法来对应,代码冗余,而且业务入侵量大

    SAGA模式

    SAGA模式的思想是对应每个业务逻辑层编写一个新的类,可以设置指定的业务逻辑层方法发生异常时,运行当新编写的类中的代码

    这样编写代码不影响已经编写好的业务逻辑代码

    一般用于修改已经编写完成的老代码

    缺点是每个事务分支都要编写一个类来回滚业务,

    会造成类的数量较多,开发量比较大

    XA模式

    支持XA协议的数据库分布式事务,使用比较少

  • 相关阅读:
    结构体对齐原理及在STM32中的设计原则和实现
    (笔记整理未完成)【数据结构】树状数组
    Java编码规范--OOP规约
    微信小程序项目开发Day1
    382.链表随机结点 | 398.随机数索引
    【21天python打卡】第7天 面向对象编程(2)
    要有遥不可及的梦想,也要有脚踏实地的本事
    图数据库实践 - 如何将图数据库应用于对公信贷
    键值编码KVC与键值监听KVO
    处理数据中不必要的部分,并将处理过的数据写入新的文件中
  • 原文地址:https://blog.csdn.net/BLWY_1124/article/details/126923427