分布式事务
# Seata
Maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
配置文件总览
seata:
registry: # TC服务所在的注册中心的信息
type: nacos # 注册中心类型Nacos
nacos: # Nacos的详细信息
server-addr: localhost: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"
data-source-proxy-mode: XA # 分布式事务模式(XA,AT)
Seata的三个角色:
- TM事务管理者,定义全局事务的范围,负责开始全局事务,提交或回滚全局事务
- TC事务协调者,维护全局和分支事务的状态,协调全局事务提交或回滚(TC服务为外部服务需要单独部署)
- RM资源管理器,与TC交互注册分支事务以及报告分支事务的状态
Seata在解决分布式事务上有很多种解决方案:
- XA模式:
- TM通知TC开启全局事务,接着分支事务注册到TC后执行,但不提交,待所有事务执行完成后TM通知TC结束全局事务,TC通过每个分支事务的状态决定提交还是回滚
- 在配置文件开启XA代理后,在事务起始位置通过
@GlobalTransactional
注解开启全局事务,并对该方法调用链的每个微服务都加上@Transactional
注解 - 优点是绝对安全,且常用的数据库都支持回滚方式恢复数据,缺点是执行效率慢,OpenFeign是一个接着一个串行调用,首个执行的事务迟迟不提交释放不了锁会影响效率
- AT模式(Seata推荐模式)
- TM通知TC开启全局事务,接着分支事务注册到TC后对即将操作的数据保存一份快照,然后执行事务并直接提交,最后TC检查每个事务状态,有失败的事务根据快照恢复,全部执行成功则直接删除快照
- AT模式需要在库中创建
undo_log
表用来保存数据快照,然后将事务模式修改为AT模式 - 优点是效率高,单个事务执行完成后直接提交无需等待整条链路执行完成,缺点是中间可能会出现数据不一致,仅保证最终数据一致