前言
前面有介绍过开源的分布式事务lcn,并基于4.1.0和5.0.2写了相应的文章,如今lcn官网发布说维护似乎成为一种问题,而seata也越来越火热,最近研究了seata源码,并集成了最新版本1.1.0(今天2020.3.16。 注意:版本不同可能会有各种奇奇怪怪的问题,所以遇到问题解决不了的时候,可以考虑是否是版本问题 ),分布式框架使用的是:
(ps:这篇文章说明是基于有一定的事务以及分布式基础的,不熟悉的还请先熟悉 springCloud-Greenwich.SR2 + springboot 2.1.6 + nacos 1.2.0 + springcloud-gateway.其中分布式事务集成了seata的AT模式,网关 gateway集成了限流,熔断,降级,并加入了时下比较流行的xxl-job做分布式任务, 安全框架使用的是oauth2+springsecurity.
seata的基本情况
seata的具体使用方式,其实 官网 其实有说明的很清楚,如果有涉及到的问题,大家可以多阅读官方文档,基本上95%你遇到的问题,别人都遇到过了,并且给了详细的解决方案,在这这篇文章里我就介绍一下seata的基本原理,然后使用我上面说的框架,集成并做一个最简单的AT模式demo.供大家参考。
首先,我们需要了解seata的3种对象:
TC: 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM: 事务管理者 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM: 资源管理器 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
用我觉得描述的比较好的一个图简单描述一下这三者之间的关系:
(图片来源: https://www.sohu.com/a/326431... )
整个全局事务执行的步骤大概可以分为4步:
1. TM向TC申请开启一个全局事务,TC返回一个全局XID,这个IXD会伴随着整个分布式事务传播。 2. RM向TC注册一个属于XID的分支事务,并commit/rollback本地事务 3. TM向TC发起全局commit/rollback 4. TC调度XID下的分支事务commit/rollback (commit时,只用删除分支的undo_log rollback时,需要反向解析undo_log 并执行sql,然后删除undo_log )