多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
https://juejin.cn/post/6844903913691283469 [官网](http://seata.io/zh-cn/) Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 ## Seata主要由三个重要组件组成: TC:Transaction Coordinator 事务协调器,事务协调器,维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM:Transaction Manager 事务管理器,定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM:Resource Manager 资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 ## AT 模式 * 基于支持本地 ACID 事务的关系型数据库。 * Java 应用,通过 JDBC 访问数据库。 ### 整体机制 两阶段提交协议的演变: * 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。 * 二阶段: * 提交异步化,非常快速地完成。 * 回滚通过一阶段的回滚日志进行反向补偿。 ### Seata的执行流程如下: 1.A服务的TM向TC申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID 2.A服务的RM向TC注册分支事务,并及其纳入XID对应全局事务的管辖 3.A服务执行分支事务,向数据库做操作 4.A服务开始远程调用B服务,此时XID会在微服务的调用链上传播 5.B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖 6.B服务执行分支事务,向数据库做操作 7.全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚 8.TC协调其管辖之下的所有分支事务, 决定是否回滚 ## seata运行流程分析 ![](https://img.kancloud.cn/5b/f2/5bf2c46ab2b41c0b6cc8b0a71b2b7101_830x697.png) 要点说明: 1.每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有undo_log。 2.在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。 3.TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。 4.第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以成。 5.第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。