分布式事务
在分布式架构中,微服务都是可以自治的,通常,微服务都会连接自己的数据库,若操作失败回滚是比较繁琐的,分布式事务显得尤为重要
案列
开启本地事务
在主程序类上使用@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);
}
发送异常测试,则每个分支事务都会回滚