产生原因
在微服务环境下,因为会根据不同的业务会拆分成不同的服务,比如会员服务,订单服务等,每个服务都有自己独立的数据库,互不影响。
服务与服务之间通讯采用rpc远程调用技术,但是每个服务中都有自己独立的数据源,即自己独立的本地事务。两个服务通讯的时候,两个本地事务互不影响,从而出现分布式事务产生的原因。
传统项目一般不会产生分布式事务,但是在项目中如果应用了多数据源方式,也会产生分布式事务。
例子
用户先下单后,扣库存失败,那么将会导致超卖;如果下单不成功,扣库存成功,那么会导致少卖。这两种情况都会导致运营成本增加,在严重情况下需要赔付。
下单和扣库存
订单服务------------------------------------>库存服务
下列是伪代码
订单服务添加订单
订单服务调用库存服务减库存
int i = 1/0; 程序报错
这种情况下订单服务事务回滚,将添加的订单回滚了,但是由于库存服务是另一个独立的事务,是回滚不了的,此时就导致了超卖。
另一种情况是订单服务程序没报错,库存服务程序报错了,这种情况下库存服务会返回给订单服务一个错误码,订单服务可以根据这个错误码进行手动抛异常进行回滚,不属于分布式事务问题。
下列是伪代码
int i = stock.inventReduce(); //订单服务调用库存服务减库存,此时库存服务出错了,返回0,代表执行失败
if(i==0){
throw new Exception(); //手动抛出异常进行事务回滚
}