避免电子商务场景中的竞争条件

Dyi*_*302 5 php database race-condition e-commerce payment-processing

我的客户有一个销售电子产品的电子商务网站,有时产品的销售次数超过了库存。这是因为,如果两个用户同时购买一种产品,而库存只剩下一种产品,则一个会话在另一个会话开始之前尚未完成将该产品注册为已售完(因此它会正常继续,认为有一个左)即使在流程开始时进行了检查。这显然会花费金钱(退款费用、退款等)并且给消费者带来不便。

所以我想知道是否有办法解决这个问题?我想在流程开始时创建一个“标记”,即它会检查库存,如果售完,它将对产品进行标记,从而防止其他会话购买它。但这也产生了更多问题:如果客户方面发生了一些事情导致他们在流程中取消(断电等),那么即使产品被标记为已售出,但自结帐以来它实际上并没有售出过程没有完成。如果这种情况持续发生,就会出现产品库存过剩的情况。其次,一个会话也可以在另一个会话将其标记为已售出时检查库存,因此即使第二个会话已经购买了它,第一个会话仍将继续。这让我们回到了最初的问题。

我正在查看数据库端的表锁定,但我不确定这是否是最好的主意。任何建议将不胜感激!

谢谢,迪普

Jus*_*ier 1

您可以设置一个故障保护机制,以便在用户结帐时下订单,但在订单发货之前不会真正从用户的信用卡中扣款。然后,对于库存已用完的情况,您可以向这些客户发送电子邮件并告诉他们“抱歉,我们已售完 X 件,我们不会向您收取费用等”。

您可以为他们的下一个订单提供某种折扣作为补偿,但此过程将避免任何退款费用、退款等,因为他们实际上从未针对没有库存的订单收取费用。

当然,听起来这会改变网站处理订单的方式,并且需要有人在准备好每个订单后将信息输入系统。此外,您需要在下订单之前对卡进行一些验证,以了解其有效,以防止欺诈 - 尽管该网站可能已经这样做了?