分布式事务 - 引出分布式事务
引出问题
在常见的商城应用里,我们会有下单的操作,同时商品有对应的库存,每接收到一个订单后,,库存就会对应的减少,在当今的分布式应用环境下,订单和商品一般会拆分为两个服务,故下单操作对应的服务动作:
用户下单,支付完成,支付系统主动通知支付结果,或者主动请求查询支付结果,得到支付结果后,将订单支付结果保存到订单数据库中。
订单支付完成,商品系统将对应商品的库存减少(更新商品库存表)。
下订单操作结束。
根据上边下单 &减库存的需求,分析如下: 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而库存信息在商品数据库,由商品服务去维护商品数据库的信息。
如何实现两个分布式服务共同完成一件事即订单支付成功自动减库存的需求?如何保证两个分布式服务的事务的一致性?
分析问题
支付后更新订单表状态为订单服务的本地数据库操作。
远程调用商品服务接口为网络远程调用请求。
上边两步操作为一个事务,当遇到 Exception 异常则需要都回滚本地数据库操作。
当以前的单体应用时,可以直接交给 spring 进行事务管理,发生 Exception 会自动回滚。当分布式部署时,如果:
支付失败,或是订单状态更新失败,此时不会涉及到库存相关的操作
如果订单成功创建,远程调用商品库存进行减库存时,发生异常,此时商品服务可以正常回滚,但是订单服务无法回滚
引出分布式事务
如何保证两个服务共同协作,从逻辑上将两个服务的操作绑定为原子操作?如何在发生异常时,在这之前完成的操作可以正常回滚,保证一致性?
为了解决这些问题,分布式事务应运而生,这些问题也就迎刃而解,此时,大概对分布式事务就应该有了基本的概念,能知道分布式事务具体是解决什么事情的了。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/f6fd397dd8cd93d5473c394c5】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论