【问题标题】:Avoid race conditions in eCommerce scenarios避免电子商务场景中的竞争条件
【发布时间】:2011-03-24 06:31:48
【问题描述】:

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

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

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

谢谢, 迪普

【问题讨论】:

  • 简单的解决方案,在付款时检查商品是否有货。 eBay 在即时付款上执行此操作,现在就购买,它说“在您付款之前,我们不会向您保证库存”,我说采用相同的解决方案。
  • 在大多数消费者的心目中,他们在结账时点击提交按钮是“付费”的。在商品发货之前,我们实际上不会收费,但我们确实希望防止他们在没有库存时购买该商品。
  • "...在流程开始时检查到位。"。在我看来,当“他们在结帐时点击提交按钮”时,您需要进行额外的检查。 - 或者你已经这样做了吗?

标签: php database e-commerce race-condition payment-processing


【解决方案1】:

我建议您执行以下操作:

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

    productAvailability - quantityReservedForThisProduct >= quantityRequested
    

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

    简而言之,如果其他人已开始结帐流程,他会自动预订这些产品。

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

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

    例如,如果用户开始了结帐过程,但过了 10 分钟仍未完成,则将其从数据库中删除并释放保留的产品。

我认为我还没有测试过这种方法;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,结账时会进行信用卡验证,并且在商品发货之前不会从信用卡中扣款,这样可以避免拒付费用,但在发货方面总是存在人为错误的可能性。 ..此外,我们希望避免出现必须通过电子邮件通知客户该商品缺货的情况,前提是我们可以首先阻止他们购买缺货商品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2015-01-30
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多