一.seata简介
Seata官方文档http://seata.io/zh-cn/docs/overview/what-is-seata.html
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
阿里巴巴推荐使用AT模式
整体机制
两阶段提交协议的演变:
-
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
-
二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
具体实现过程:
一阶段
1.拦截得到业务sql,解析sql 的得到sql的类型(update/delete/...),表,条件等相关信息.
2.查询执行前的数据,生成前镜像
3.执行业务sql
4.查询操作后数据,生成后镜像
5.把前后镜像数据以及业务sql相关的信息组成一条回滚日志记录,插入到undo_log表
6.提交前,向TC注册分支,申请业务表的对应主键的记录的全局锁.
7.本地事务提交
8.将本地事务提交结果上报给TC
二阶段
提交
1.收到TC的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给TC
2.异步任务阶段的分支提交请求将异步的和批量的删除相应的undo_log记录
回滚
1.收到TC的回滚分支请求,开启一个本地事务
2.通过XID和BranchId 查找到对应的UNDO_LOG记录
3.数据校验,根据前后镜像与当前数据进行比较,如果匹配则继续回滚逻辑,不匹配,说明数据被别的事务修改过,这种情况需要根据配置策略来做处理.
4.根据UNDO_LOG中前镜像和业务sql生成回滚语句.
5.提交本地事务,并把事务的执行结果上报给TC