分布式事务Seata | 您所在的位置:网站首页 › mongodb事务 › 分布式事务Seata |
承接上文分布式事务-二阶段提交 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都执行成功的消息,第二阶段就做全局的提交,否则全局回滚。 |
CopyRight 2018-2019 实验室设备网 版权所有 |