承接上文分布式事务-二阶段提交
Seata是开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务,包含AT、TCC、 SAGA、XA四种事务模式,为用户打造一站式的分布式解决方案。
Seata提供的4种事务模式都是由2PC(二阶段提交)转换过来的。
在介绍该流程之前,先了解下3个Seata角色,
- TC 事务协调者
TC是Seata服务端,维护全局和分支事务的状态,驱动全局事务提交或回滚。 - TM 事务管理者
定义全局事务的范围,开始全局事务,提交或回滚全局事务。 - RM 资源管理器
事务参与者,管理分支事务,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
在事务开始之前,TM和所有的RM都需要先注册到TC。
注册以后,用户发起请求到TM(business),TM开启全局事务和进行远程调用库存(库存减1)和订单服务(加1),再由订单远程调用用户服务(加积分)。
TM是整个事务的入口,全局事务或分布式事务的开启者。
TC就是Seata Server,TC是统筹者,所有的分支事务都需要注册到TC上。
注册之后,由事务发起者来发送对应的请求,告诉每个执行者开始执行业务,无论成功或失败,都会发送消息通知TC,最后由TC告诉所有RM是提交还是回滚。
Seata配置Nacos作为注册中心和配置中心
Seata集群存储事务的数据,通过db数据库的方式存储数据。
Nacos可以完成对Seata集群的负载均衡。
用Seata管理分布式事务,通过TC来统筹RM,事务的参与者RM是Seata的客户端,TC是Server端,Server和Client端要注册到同一个namespace中。
Seata AT模式是二阶段提交模式的演变,是无侵入的分布式事务解决方案,在AT模式下,一阶段用户只需要关注自己的业务sql,Seata框架会自动生成事务的第二阶段进行提交或回滚操作。
- 一阶段:业务数据和回滚的日志记录在同一个本地事务中提交,然后释放本地锁和连接资源。
- 二阶段:提交或回滚(回滚通过一阶段的回滚日志进行反向补偿)。
一阶段,会拦截业务sql(比如订单先调用库存(库存减1),再生成订单),Seata解析sql语句,同时要找到当前要更新的业务数据,比如库存减1,在数据被更新前,保存undolog日志,再执行业务sql,更新之后的数据再保存到redolog日志。
如果一阶段某个服务的本地事务没有通过,就全局回滚,让当前所有数据回滚到开始之前的状态,否则就提交全局事务。
回滚的时候所用到的数据就在undolog,即在数据被正式更新之前所保存下来的原数据作为回滚的依据,通过回滚反向生成sql完成分支事务的回滚,事务结束后会释放所有资源和删除所有日志。
AT模式详细分解
订单服务执行本地事务订单+1,库存服务执行本地事务库存减1。
TM发起全局事务的执行,不同的分支事务需要执行自己的本地事务。
订单服务既是RM又是TM,在订单开启全局事务,远程调用库存服务,又要执行本地事务订单+1。
Order告诉TC我要开始执行分支事务了,Stock也要开始执行分支事务,两个RM开始执行自己的分支事务。
Order注册分支事务,记录undolog,即在真正执行分支事务(本地事务)数据更改之前的数据要记录在undolog中,更改之后的数据要记录在redolog中。
Order开启远程调用Stock,Stock也一样开始注册自己的本地事务,记录更改之前的数据到undolog,记录更改之后的数据到redolog。
2个分支事务执行完之后,需要告诉TC当前这2个事务的执行状态,TC如果收到了2个RM都执行成功的消息,第二阶段就做全局的提交,否则全局回滚。