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

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

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

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

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

谢谢, 滴滴答答

最佳答案

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

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

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

关于php - 避免电子商务场景中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3389000/

相关文章:

php - 如何在mysql中使用oop从mysql读取数据?

php - 我可以在 PHP 中使用运算符作为函数回调吗?

database - Wildfly CLI XA-Datasource 缺少属性

php - 哪个第三方购物车可以轻松与 MODX Revolution 集成?

php - 处理两个人同时在网上商店购买一件独特商品的问题

PHP 将远程图像保存到 Amazon S3

php - 条件赋值

java - 部署一个带有数据库的Java App,用户需要安装什么?

mysql - 空的mysql_query,想不通

asp.net - hotcake commerce 自定义付款方式不起作用