【问题标题】:Concurrent Payment Control并发支付控制
【发布时间】:2019-10-27 04:49:27
【问题描述】:

当我点击“下订单”时,我已开始交易并将列 is_payment_processing 设置为 True,然后将用户带到商家网站,然后可能存在三种可能性:

  1. 用户登陆成功回调页面
  2. 用户登陆失败回调页面
  3. 用户既没有成功也没有失败回调,因为他关闭了窗口。

在第三种情况下:产品将保持 is_payment_processing 为 True 的状态。并且,尝试签出同一产品的其他用户将无法这样做。但在这种情况下,我可能会失去一些客户并造成一些不便。

希望每分钟运行一个 cron 作业,该作业将跟踪该列的最后修改时间,如果超过 3 分钟未更改,则将该标志设置为 False。

这里最好的方法应该是什么?在一般情况下这是如何实现的? (并发控制)

另一个想法: Visit this question

【问题讨论】:

  • 您是否有机制可以与商家网站核对以了解交易是否仍在进行中?
  • @AbhishekAgarwal:不,我不能,除非控件不进行成功或失败回调。因为我在这些回调 url 中从供应商那里收到参考 id,我可以用它来查询状态。

标签: python mysql django concurrency e-commerce


【解决方案1】:

理想情况下,您的Product 模型中应该有一个stock 字段,以保持该产品的可用数量。

当有人下订单时,应创建一个单独的order 实例,并指定Prodduct 的数量。只有在收到order 的回调或收到确认付款的 webhook 后,才能减少库存。

这不会阻止其他客户在商品实际售出之前下订单。

另一种方法是在客户进入回调页面时减少库存,如果在一定时间内未收到付款,则释放库存。这需要后台任务。

注意:使用来自django.modelsF 对象同时减少库存,以便从数据库值而不是实例属性中减少库存。

【讨论】:

  • 如果客户购买了产品,而另一个用户能够在第一个客户交易完成之前购买该产品,则第一种方法会造成不便。在这里,我们必须将钱退还给第一位客户,这可能需要长达一周的时间
【解决方案2】:

如果可以的话,Cron 似乎是最好的方法(如果您在共享主机上,许多提供商不允许您使用任何 cron)

我可以通过检查事务是否仍在进行中来使 cron 变得智能。 (这里我假设我有这样做的机制)

编辑: 请注意,在付款交易进行后锁定库存是非常标准的

【讨论】:

  • 我正在呈现在此视图/交易期间自动将值发布到供应商站点的表单,同时,当用户付款时,其他用户可以启动我在任一回调上开始交易之前的订单流程。
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2021-05-15
  • 2015-10-19
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多