分布式事务Seata快速上手

前言

  • 在单体项目中的事务,使用的技术叫Spring声明式事务,能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性,但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚,这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata
  • Seata保证微服务远程调用业务的原子性,Seata将为用户提供了 AT、TCC、SAGA 和 XA,事务模式,为用户打造一站式的分布式解决方案。


一、什么是Seata?

  • Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,也是Spring Cloud
    Alibaba提供的组件。
  • Seata官方文档:https://seata.io/zh-cn/

二、Seata运行原理图

典型的远程调用结构
上面结构是比较典型的远程调用结构,如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作,声明式事务无法完成这个操作,需要使用Seata来解决。

三、Seata启动

  • 安装好Seata后,在bin文件夹下输入cmd进入dos窗口;
  • 输入启动nacos的命令:seata-server.bat -h 127.0.0.1 -m file;
  • 输入后,最后出现8091端口的提示即可。

四、添加依赖&修改配置文件

<!--   Seata和SpringBoot整合依赖     -->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<!--  Seata 完成分布式事务的两个相关依赖(Seata会自动使用其中的资源)  -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>
seata:
  # 定义事务的分组,一般是以项目为单位的,不同项目用它来区分
  tx-service-group: csmall_group
  service:
    vgroup-mapping:
      # 设置csmall_group分组使用默认(default)的seata配置
      csmall_group: default
    grouplist:
      # 设置seata的ip和端口号位置
      default: localhost:8091

五、测试效果

  • 要想seata出现效果,我们要有一个发生异常的情况,当发生异常时,去观察是否会回滚,我们可以编写代码随机的抛出异常,来根据是否有异常,是否回滚,判断seata是否有效。
@Override
public void orderAdd(OrderAddDTO orderAddDTO) {
    // 1.先去减少订单中商品的库存数量(调用stock模块减少库存的方法)
    // 库存模块减少库存需要StockReduceCountDTO对象,才能运行,所以先实例化它
    StockReduceCountDTO countDTO=new StockReduceCountDTO();
    countDTO.setCommodityCode(orderAddDTO.getCommodityCode());
    countDTO.setReduceCount(orderAddDTO.getCount());
    // 利用dubbo调用stock模块的业务逻辑层方法实现库存的减少
    stockService.reduceCommodityCount(countDTO);

    // 2.从购物车中删除用户勾选的商品(调用cart模块删除购物车商品的方法)
    // 利用dubbo调用cart模块的业务逻辑层方法实现购物车中商品的删除
    cartService.deleteUserCart(orderAddDTO.getUserId(),
                                orderAddDTO.getCommodityCode());
    // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    if(Math.random()<0.5){
        // 随机发生业务异常
        throw new CoolSharkServiceException(
                ResponseCode.INTERNAL_SERVER_ERROR,"发生随机异常!");
    }
    // 3.新增订单信息
    Order order=new Order();
    BeanUtils.copyProperties(orderAddDTO,order);
    // 执行新增
    orderMapper.insertOrder(order);
    log.info("新增订单信息为:{}",order);

}

六、Seata其他模式介绍

  • TCC模式
    • TCC模式就是自己编写代码完成事务的提交和回滚。
    • 在TCC模式下,我们需要为参与事务的业务逻辑编写一组共3个方法 (prepare\commit\rollback) 。
      • prepare:准备
      • commit:提交
      • rollback:回滚
    • prepare方法是每个模块都会运行的方法,当所有模块的prepare方法运行都正常时,运行commit,当任意模块运行的prepare方法有异常时,运行rollback,这样的话所有提交或回滚代码都由自己编写。
    • 优点:虽然代码是自己写的,但是事务整体提交或回滚的机制仍然可用(仍然由TC来调度)。
    • 缺点:每个业务都要编写3个方法来对应,代码冗余,而且业务入侵量大。
  • SAGA模式
    • SAGA模式的思想是对应每个业务逻辑层编写一个新的类,可以设置指定的业务逻辑层方法发生异常时,运行当新编写的类中的代码,相当于将TCC模式中的rollback方法定义在了一个新的类中,这样编写代码不影响已经编写好的业务逻辑代码,一般用于修改已经编写完成的老代码,缺点是每个事务分支都要编写一个类来回滚业务,会造成类的数量较多,开发量比较大。
  • XA模式
    • 支持XA协议的数据库分布式事务,使用比较少。

总结

  • 以上主要是Seata软件AT模式的运行流程,AT模式的运行事务分支都必须是操作关系型数据库(Mysql\MariaDB\Oracle),这个条件不满足,就无法使用AT模式。
  • 因为关系型数据库才支持提交和回滚,其它非关系型数据库都是直接影响数据(例如Redis)。
  • 所以如果我们在业务过程中有一个节点操作的是Redis或其它非关系型数据库时,就无法使用AT模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值