Seata(Simple Extensible Autonomous Transaction Architecture):集高性级与易用性的一种分布式事务微服务架构,其前身是 fescar,github地址:https://github.com/seata/seata。
Seata有3个基本组件:
- 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
- 事务管理器TM:定义全局事务的范围:开始全局事务,提交或回滚全局事务。
- 资源管理器(RM):管理分支事务正在处理的资源,与TC进行对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。
Seata管理的一个典型分布式事务过程如下:
- TM asks TC to begin a new global transaction. TC generates an XID representing the global transaction:TM 向 TC 申请开启一个全局事务,TC生成一个XID用于表示全局唯一的事务;
- XID is propagated through microservices' invoke chain:XID在微服务调用链表的上下文中进行传播;
- RM registers local transaction as a branch of the corresponding global transaction of XID to TC:RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖
- TM asks TC for committing or rollbacking the corresponding global transaction of XID: TM 向 TC 发起针对 XID 的全局提交或回滚决议。
- TC drives all branch transactions under the corresponding global transaction of XID to finish branch committing or rollbacking: TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
seata主要优化的思路是基于这样一个事务,一个正常运行的业务,绝大概率(95%甚至以上)都应该是成功提交的,因此在第一阶段就本地事务提交,这样可以95%以上的概率可以省去第二阶段持锁时间,当然整体就提高了效率,保证了高并发高吞吐。当然 seata使用有一个前提:RM必须支持ACID事务。
第一阶段已经commited, 第二阶段如何回滚呢?seata通过RM来保证,将业务数据在更新前后的数据镜像组织成回滚日志(RM通过XID找到对应的的undo log),利用本地事务的ACID特征实现相应的回滚,最后向TC进行回滚结果上报。
以上这种对业务无侵入的模式称为AT(Automatic Transaction),是seata的默认模式。与之相应的另一种工作模式是MT(Manual Transaction)[或者TCC],它是一种对业务有入侵的模式,commit或者rollback等操作由用户自定义,业务逻辑被分解为Prepare/Commit/Rollback3部分。
Seata由于本地事务在第一阶段就提交了,Seata(AT模式)的默认全局隔离级别是Read Uncommitted,当然也是支持Read Committed的,如Select * from * for update。