在分布式系统中,一个服务调用多个远程服务时,多个事务必须同时成功或失败。每一个服务的事务称为分支事务,整个业务称为全局事务
seata架构中有三个角色:
TC事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚
TM事务管理者:定义全局事务的范围、开始,提交,回滚全局事务
RM资源管理器:管理分支事务,与TC交谈以注册分支事务、报告分支事务状态
其中RM散布在微服务的模块中,他们的集合是TM。RM会对TC进行注册与报告
如何部署TC服务
1.通过SQL,基于数据库持久化存储
2.通过配置文件,使用docker进行部署
docker run --name seata \ -p 8099:8099 \ -p 7099:7099 \ -e SEATA_IP=192.168.88.95 \ -v /data/hmall/seata:/seata-server/resources \ --privileged=true \ --network hm-net \ -d \ seataio/seata-server:1.5.2
3.在项目中引入maven依赖
<!--统一配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--读取bootstrap文件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--seata--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
4.在nacos上添加共享配置
seata: registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址 type: nacos # 注册中心类型 nacos nacos: server-addr: 192.168.88.95:8848 # nacos地址 namespace: "" # namespace,默认为空 group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP application: seata-server # seata服务名称 username: nacos password: nacos tx-service-group: hmall # 事务组名称 service: vgroup-mapping: # 事务组与tc集群的映射关系 hmall: "default"
5.在bootstrap.yml添加dataId
6.在docker查看是否加载成功
docker logs seata
查看其中信息有微服务字样相关信息即为成功
XA模式:优点:满足了ACID特性;实现简单,不会代码侵入;缺点:消耗资源量较大,影响性能;依赖关系型数据库实现事务
如何实现XA模式:
1.配置文件中修改seata,添加XA模式
seata: data-source-proxy-mode: XA
2.标记入口方法
@GlobalTransactional private void checkCartsFull(Long userId) {}
AT模式:优点:解决了XA模式的问题,缺点:会出现短暂的不一致问题(已经提交了,在未结束先不能执行undo)
如何实现AT模式:
1.每个数据库都载入seata-at.sql
2.如果之前设置是XT模式记得删除,因为默认配置是AT模式
标签:事务,服务,seata,XA,nacos,cloud,分布式 From: https://www.cnblogs.com/kun1790051360/p/18168403