在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案。fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。
Seata介绍
本文以一个用户下单购买商品的系统为例,介绍开源框架Seata的原理和使用,下单该系统涉及三部分服务:
- 仓储服务:对给定的商品扣除仓储数量;
- 订单服务:根据采购需求创建订单;
- 帐户服务:从用户帐户中扣除余额;
分布式事务的主要作用是保证微服务情况下用户下单过程中数据的一致性。这里的一致性可以这样理解:不会出现用户余额扣除成功,但是仓储和订单相关操作失败的场景,三者要么同时成功,要么同时失败。
单机事务场景
如果用户下单购买商品涉及到的服务都在一个传统的单机服务中,三部分服务可以共享同一个数据库实例。这种情况下,我们可以通过本地事务的一致性保证仓储/订单/账户三者之间数据的一致性。
如上图所示,在单机服务中,三部分内容共用同一个数据库实例,所以我们只需要本地事务就可以解决数据的一致性,以Spring框架为例,我们只需要在方法上添加@Transaction
注解就可以实现整个购买流程中数据的一致性:
@Transaction
public void purchase(){
doStoreBusiness();
doOrderBusiness();
doAccountBusiness();
}
分布式事务场景
在微服务框架中,仓储/订单/账户服务部署在不同的服务器上,使用不同的数据库实例,与单机模式完全不同。单机模式中的事务通常要求事务涉及的数据源为同一个,并且事务涉及的数据库操作在同一个数据库链接中,分布式情况下显然不满足条件。
所以在分布式场景如何保证数据的一致性呢?这就是Seata需要解决的问题了。
Seata解决方案
Seata是用于解决分布式事务的开源框架,其内部有关于分布式事务的定义如下:分布式事务是由多个分支事务组成的全局事务,其中每个分支事务都是本地事务的形式。
Seata框架包含三部分内容:
- 事务协调器(Transaction Coordinator,TC):维护全局事务和分支事务的状态,进行全局事务提交或全局事务回滚;
- 事务管理器(Transaction Manager,TM):定义全局事务,开启全局事务、提交全局事务或回滚全局事务;
- 资源管理器(Resource Manager,RM):管理分支事务中的资源,向事务管理器注册分支事务和并报告分支事务的状态,负责分支事务提交或回滚;
一个典型的seata分布式事务的流程如下:
- TM向TC发出开