Seata
Seata是Spring提供的分布式事务解决方案
官网:https://seata.apache.org/zh-cn/docs/user/quickstart
基本概念
- 事务模式
Seata 支持以下事务模式:
AT 模式(Auto Transaction):自动补偿型事务模式,无侵入业务代码(最常使用)
TCC 模式(Try-Confirm-Cancel):需要业务实现 Try、Confirm、Cancel 三个接口
SAGA 模式:长事务解决方案
XA 模式:基于 XA 协议的强一致性分布式事务
- 核心组件
TC (Transaction Coordinator) - 事务协调器:维护全局和分支事务的状态,驱动全局事务提交或回滚
TM (Transaction Manager) - 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
AT模式
AT模式工作流程
第一阶段:执行阶段
- 解析SQL:Seata的JDBC数据源代理会拦截业务SQL,解析SQL语义,找到业务SQL要更新的业务数据
- 查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据,保存这些数据(前镜像)
- 执行业务SQL:执行业务SQL,更新业务数据
- 查询后镜像:根据前镜像的主键,查询更新后的数据(后镜像)
- 插入回滚日志:把前后镜像数据和业务SQL相关的信息组成一条回滚日志记录,插入到UNDO_LOG表中
- 提交前向TC注册分支:向TC(事务协调器)注册分支事务,并申请相关数据的全局锁
- 本地事务提交:业务数据的更新和前面步骤生成的UNDO LOG一并提交
- 上报执行状态:将本地事务提交的结果上报给TC
第二阶段:提交/回滚阶段
- 成功提交时
- TC收到所有分支事务的成功响应,发起全局提交指令
- RM(资源管理器)收到TC的提交指令后,异步批量删除UNDO LOG记录
- 需要回滚时
- TC收到任一分支事务的失败响应或超时,发起全局回滚指令
- RM收到TC的回滚指令后:
- 通过XID和Branch ID找到对应的UNDO LOG记录
- 校验UNDO LOG中的after image数据与当前数据是否一致
- 如果不一致(说明数据被其他事务修改过),需要人工介入处理
- 如果一致,则根据UNDO LOG中的before image恢复数据
- 删除UNDO LOG记录
基本使用
可以直接参考官网文档,写的非常好