1. 将订单状态改为已支付
2. 记录支付数据
3. 调用库存服务的 http api 接口,减库存并发货
以上三个操作,需要是一个原子操作,要么一起成功,要么一起失败。
1 、2 好说,都是数据库操作,一个事务就 ok 。
但 3 是另一个类型的操作。
我想到方案是:
1. 3 放在事务中,3 成功再提交事务,否则回滚。缺点是 3 会卡事务,只适用于流量特别低,3 执行很快的系统。
2. 3 放队列中,失败了重试。缺点有 2:a ,放队列的操作也可能失败,除非放队列的操作也放事务中; b ,3 可能永远不会成功。