Seata介绍
本文以一个用户下单购买商品的系统为例,介绍开源框架Seata的原理和使用,下单该系统涉及三部分服务:
-
仓储服务:对给定的商品扣除仓储数量;
-
订单服务:根据采购需求创建订单;
-
帐户服务:从用户帐户中扣除余额;
分布式事务的主要作用是保证微服务情况下用户下单过程中数据的一致性。这里的一致性可以这样理解:不会出现用户余额扣除成功,但是仓储和订单相关操作失败的场景,三者要么同时成功,要么同时失败。
单机事务场景
如果用户下单购买商品涉及到的服务都在一个传统的单机服务中,三部分服务可以共享同一个数据库实例。这种情况下,我们可以通过本地事务的一致性保证仓储/订单/账户三者之间数据的一致性。
如上图所示,在单机服务中,三部分内容共用同一个数据库实例,所以我们只需要本地事务就可以解决数据的一致性,以Spring框架为例,我们只需要在方法上添加 @Transaction 注解就可以实现整个购买流程中数据的一致性:
@Transaction public void purchase(){ doStoreBusiness(); doOrderBusiness(); doAccountBusiness(); }
分布