文章目录
目录
前言
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
一、Seata的执行流程如下
A服务【订单微服务】的TM[事务发起者]向TC[seata服务端]申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID
A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播
B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
B服务执行分支事务,向数据库做操作
全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚
TC协调其管辖之下的所有分支事务, 决定是否回滚
TM:事务发起者【在哪个方法上添加了全局事务注解的】
TC : 事务管理器【seata的服务端】
RM: 每个操作数据库的微服务
XID: 全局事务id
二、使用步骤
(1)下载seata1.3.0--->
支持集群模式 把开源项目的源码也下一下
修改conf/file.conf 让seata集群信息可以共享,我们应该修改它的保存位置:
指定seata的注册中心地址和配置中心的内容
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "88aa134e-24e9-45ab-a336-6ba2ce63a913"
cluster = "default"
username = "nacos"
password = "nacos"
}
eureka {
serviceUrl = "http://localhost:8761/eureka"
application = "default"
weight = "1"
}
redis {
serverAddr = "localhost:6379"
db = 0
password = ""
cluster = "default"
timeout = 0
}
zk {
cluster = "default"
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
consul {
cluster = "default"
serverAddr = "127.0.0.1:8500"
}
etcd3 {
cluster = "default"
serverAddr = "http://localhost:2379"
}
sofa {
serverAddr = "127.0.0.1:9603"
application = "default"
region = "DEFAULT_ZONE"
datacenter = "DefaultDataCenter"
cluster = "default"
group = "SEATA_GROUP"
addressWaitTime = "3000"
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = "88aa134e-24e9-45ab-a336-6ba2ce63a913"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
}
consul {
serverAddr = "127.0.0.1:8500"
}
apollo {
appId = "seata-server"
apolloMeta = "http://192.168.1.204:8801"
namespace = "application"
}
zk {
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
etcd3 {
serverAddr = "http://localhost:2379"
}
file {
name = "file.conf"
}
}
然后
然后
三、配置微服务客户端
在每个微服务中添加seata依赖
<!--seata 一定要保证和seata服务的版本匹配-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
修改配置文件
最后要在需要的业务层 添加全局事务 当做tm
@GlobalTransactional //全局事务 tm队长 全局事务
回滚其他微服务连接数据库。
public void saveOrder(Order order) {
log.info("-------->开始创建新订单");
orderDao.saveOrder(order);
log.info("-------订单微服务开始调用账户,做扣减");
accountFeign.increase(order.getUserId(),order.getMoney()); //事务提交
log.info("-------订单微服务开始调用账户,做扣减end");
int c=10/0;
log.info("--------订单微服务开始调用库存,做扣减");
storageFeign.increase(order.getProductId(),order.getCount());
log.info("-------订单微服务开始调用库存,做扣减end");
log.info("-------修改订单状态");
orderDao.updateStatus(order.getId());
log.info("-------修改订单状态结束");
log.info("--------下订单结束了,哈哈哈哈");
}
总结
无