分布式事务
# Seata
Seata 服务端配置文件
务必配置seata.registry
属性,将 seata 注册到注册中心,SpringCloud 项目中 seata 的分布式事务只对微服务环境下的服务生效
seata:
config: # 控制 Seata 如何加载配置文件,可以让 seata 同其他微服务一样在配置中心拉取配置文件
type: nacos # 默认为 file,表示使用本地配置文件
nacos:
server-addr: 127.0.0.1:8848
#group: 'SEATA_GROUP'
#namespace: ''
#username: 'nacos'
#password: 'nacos'
registry: # 控制 Seata 使用哪个服务注册中心,分布式事务只会对注册中心内的微服务生效
type: nacos # 默认为 file,表示不是用注册中心
nacos:
# application: seata-server
server-addr: nacos:8848
# group: SEATA_GROUP
# namespace:
# cluster: default
username: nacos
password: nacos
store: # 控制事务数据如何持久化
mode: file # 默认为 file,表示将数据存储在本地文件中
Maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
Seata的三个角色:
- TC事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚,TC为外部服务需要单独部署,就是 Seata 服务
- TM事务管理者:定义全局事务的范围,负责开始全局事务,提交或回滚全局事务
- RM资源管理器:与TC交互注册分支事务以及报告分支事务的状态
Seata 支持多种分布式事务处理模式:
- AT模式(默认事务模式,Seata 推荐的模式)
- AT模式需要在库中创建
undo_log
表保存一份数据修改之前的快照 - AT模式下每个微服务都有自己的事务,请求链路中服务 b 的业务没有处理完成并不影响服务 a 的提交
- 请求链路中如果某一环节出现问题,会读取
undo_log
表保存的快照数据,对已修改的数据进行补偿恢复 - 优点是效率高,单个事务执行完成后直接提交无需等待整条链路执行完成,缺点是中间可能会出现数据不一致,仅保证最终数据一致
- AT模式需要在库中创建
- XA模式:
- 当前微服务操作完成后并不提交事务,待所有事务执行完成后通知TC结束全局事务,TC通过每个分支事务的状态决定提交还是回滚
- 优点是绝对安全,且常用的数据库都支持回滚方式恢复数据,缺点是会长期占用数据库所导致执行效率慢
- TTC模式:
- TTC模式不同于