菜单
本页目录

分布式事务

在分布式架构中,微服务都是可以自治的,通常,微服务都会连接自己的数据库,若操作失败回滚是比较繁琐的,分布式事务显得尤为重要

案列

开启本地事务

在主程序类上使用@EnableTransactionManagement,在service接口上使用@Transactional即可,但此种方法只能针对单个微服务生效 需要在每个需要开启事务的微服务上开启

Seata原理

若分布式调用中,例如上图的订单出现异常则会造成部分数据回滚,而部分数据不回滚 在上图中Business服务会调用其余三个服务,这些服务的事务即分支事务,共同组成的business的事务即全局事务 每一个的事务都有自己的管理器,管理器会向全局事协调者沟通,由全局事务协调者决定回滚

引入Seata

安装seata

解压Seata压缩包后进入bin目录使用seata-server.bat启动seata即可

引入seata

<!--        seata分布式事务-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

seata依赖的版本要和seata服务的相匹配

配置文件

引入seata的服务需要配置文件否则无法启动服务 seata支持高可用,可以使用分组来指定当前服务的seata服务器

seata:
  tx-service-group: default_tx_group

若不写则有默认分组,本次无需填写

 service {
   #transaction service group mapping
   vgroupMapping.default_tx_group = "default"
   #only support when registry.type=file, please don't set multiple addresses
# 分组服务器列表
   default.grouplist = "127.0.0.1:8091"
   #degrade, current not support
   enableDegrade = false
   #disable seata
   disableGlobalTransaction = false
 }

@GlobalTransactional

在全局事务接口上使用@GlobalTransactional即可

@Override
    @GlobalTransactional
    public void purchase(String userId, String commodityCode, int orderCount) {
        //1. 扣减库存
        storageFeignClient.deduct(commodityCode, orderCount);

        //2. 创建订单
        orderFeignClient.create(userId, commodityCode, orderCount);
    }

发送异常测试,则每个分支事务都会回滚