欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式事务个人理解

程序员文章站 2022-07-12 17:02:36
...

分布式事务起因

微服务逐渐取代了原有的单体应用,服务粒度不断细化。各个链路都会操作数据库,当某一个链路发生异常时,需要保证分布式系统(微服务的集合)数据的一致性。

这样能保证一致性么?

首先给出一个业务场景,包含2个微服务,订单中心,账户中心

  1. 用户在电商下了一张订单SO,订单支付状态为UNPAY
  2. 用户支付订单,需要做2件事。第一,扣除账户金额,生成流水;第二,修改订单支付状态

先看如下的代码能保证2个系统的数据一致性么?

此场景的数据一致性约束:
扣除金额并生成流水,订单支付状态变成已支付。

@Transactional(rollbackFor = Exception.class)
public Response<Boolean> pay(Long userId, Order order) {
	//扣除账户金额,本地事务
	accountDao.pay(userId, order);
	// 2. 调用订单中心服务接口,修改订单状态
	Response<Boolean> response = orderServiceFacade.payOrder(order);
	if( true.equals(response.getResult) ) {
		return Response.Ok();
	} else {
		throw new Exception();
	}
}

乍一看,这个逻辑满足了数据一致性,调用订单中心服务失败后,就可以回滚账户金额,撤销支付流水。然而,网络的太复杂了。考虑以下场景

  1. 第二步调用订单中心超时了,调用方报超时错误,实际上订单中心已经修改了支付状态
  2. 第二步修改订单状态成功,调用方提交事务失败(例如事务超时),造成了订单状态修改成功,然而支付流水未生成

综上,在分布式微服务场景下,服务提供方无论返回成功或失败,均不能保证数据一致性。

相关标签: 分布式事务