4

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

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

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

谢谢,迪普

4

2 回答 2

1

您可以设置故障保险,以便在用户结账时下订单,但在订单发货之前不会实际从用户的信用卡中扣款。然后,对于库存已用完的情况,您只需给这些客户发送电子邮件并告诉他们“对不起,我们已经售罄 X,您不会被收取费用等”。

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

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

于 2010-08-02T15:09:51.880 回答
0

我建议您执行以下操作:

  1. 将产品添加到购物车时,不要减少产品的库存;您不想错过任何可能的未来销售;
  2. 当用户决定开始结帐过程时,您可以在后端将购物车中的所有产品标记为保留,方法是将它们添加到单独的数据库表中。
  3. 如果用户 B 稍后开始结帐过程,那么您可以再次检查购物车中每个产品的可用性,如下所示:

    productAvailability - quantityReservedForThisProduct >= quantityRequested
    

    如果上述条件为假,则表示其他人已经表达了购买意愿。因此,您可以让您的用户了解当前情况。

    简而言之,如果其他人已经开始结账流程,他会自动保留这些产品。

  4. 然后当第一个用户的支付成功时,我们用保留产品和存储实际产品的表更新表,即减少库存可用性。

  5. 此外,我们不希望出现用户已预订产品(即开始结账流程)但从未购买过的情况。因此,您可以引入TTL机制。因此,您可以在固定的时间间隔内删除超过固定时间的结帐流程。

    例如,如果用户开始了一个结帐过程,但在 10 分钟之后它还没有完成,则将其从数据库中删除并释放保留的产品。

请记住,我还没有测试过这种方法;

于 2014-10-24T13:54:52.963 回答