PHP支付后回调处理数据大家都是如何保持数据一致性的?

支付完了之后,
第一步。改订单状态为已支付
第二步减库存。
第三步销掉自己使用的优惠券
第四步消掉自己使用的积分。

请问这4步如何保证一致性呢?
有可能就是订单改了已支付但是库存和优惠券,积分没有减少。
如果使用try catch 是保证后面处理一致性了,但是用户有可能支付了但是订单还是未支付状态。
大佬。大大大佬们都是咋解决的?

阅读 4.7k
5 个回答

数据库事务呀。
出错了rollback掉。
其余的都是业务问题啦。

防止并发和一致性:队列,幂等消费,事务

说一点自己的见解,未必全适用,或许可以给你点思路
如果你要保证很强的一致性,那就事务处理,这里说的事物可以是数据库的事务,也可以是程序模拟的,比如你说的try。这类问题用事务处理是很常见的解决办法。
但是真实的业务往往是复杂的,流程可能很多很多例如生成交易快照,更新用户积分,下发通知等等可能还要调用第三方系统。又或者是流程太多事务执行超过了用户能接受的等待时间。所以还有一种处理方法就是保持最终一致性,不管你是用消息队列还是延时调用等等都是保持最终一致性的手段。这里就涉及一个流程分离的概念,把流程做一个主辅分离。
回到你这个例子,因为你这个例子流程较少,可以先执行234步,再执行1,如果1不成功有个补偿机制把234撤销就好了,就是个反向操作。这里举个例子可以看看京东下单的时候都是先预扣积分和优惠卷的,如果支付失败,再给你加回积分和优惠卷。这也是一种常见的手段。
最后,这类问题没有统一答案,具体问题具体分析,因为各个流程的实时和容错的需求不一样。在实际操作中,一个下单操作,后续的流程中也会将上述的各种手段组合使用,根据流程的需求来定。

第一步收到通知直接改已支付,后面三步入队列做成事务。有什么问题吗?

第三步销掉自己使用的优惠券
第四步消掉自己使用的积分。
这两步是一下单就扣的,就是订单生成的时候必须要扣,否则会出现以下状况:
1.微信支付成功回调了,可是积分不够扣了(积分在回调成功之前被其他地方使用了,下单前是够的)
2.微信支付成功回调了,优惠券被其他订单使用了,导致扣除优惠券不成功,并且订单金额付少了

剩下的改订单状态、扣库存都是可控的数据,只需要回调的时候使用事务进行处理就好

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题