Seata的架构
- TC(Transaction Coordintor)-事务协调者:维护全局和分支事务的状态,协调全局事务提交或者回滚。
- TM:(Transaction Manager)-事务管理器:定义全局事务的范围,开始全局事务,提交和回滚事务
- RM(Resource Manager)-资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态
微服务整合seata(前提是你已经部署好了seata)
引入依赖
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
在nacos上添加一个共享的seata配置,命名为shared-seata.yaml,内容如下:
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
type: nacos # 注册中心类型 nacos
nacos:
server-addr: 192.168.203.130:8848 # nacos地址
namespace: "" # namespace,默认为空
group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
application: seata-server # seata服务名称
username: nacos
password: nacos
tx-service-group: zxm # 事务组名称
service:
vgroup-mapping: # 事务组与tc集群的映射关系
zxm: "default"
然后去项目中的bootstrap.yaml文件中引入shared-seata.yaml共享配置
XA模式:
一阶段的工作:
- RM注册分支事务到TC
- Rm执行分支业务sql但不提交
- RM报告执行状态到TC
二阶段的工作:
- TC检测各分支事务执行状态
a. 如果都成功,通知所有RM提交
b. 如果有失败,通知所有RM回滚事务
- RM接收TC指令,提交或者回滚事务
Java中如何实现?
非常简单,第一步,在application.yaml中
seata:
data-source-proxy-mode: XA #开启数据源代理的XA模式
第二步:给发起全局事务的入口方法添加@GlobalTransactional注解,再给远程调用的方法上加上@Transactional注解
AT模式:Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,不过弥补了XA模型中资源锁定周期过长的缺陷
阶段一RM的工作:
- 注册分支事务
- 记录undo-log(数据快照)
- 执行业务sql并提交
- 报告事务状态
阶段二提交时RM的工作:
- 删除undo-log即可
阶段二回滚时RM的工作:
- 根据undo-log恢复数据到更新前
在Java中使用AT模式:
第一,首先在每一个微服务项目中准备一个undo-log表,就是seata-at.sql
第二,application.yaml中
seata:
data-source-proxy-mode: AT #开启数据源代理的AT模式