首页 > 解决方案 > 并发支付控制

问题描述

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

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

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

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

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

另一个想法: 访问这个问题

标签: pythonmysqldjangoconcurrencye-commerce

解决方案


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

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

这不会阻止其他客户在商品实际售出之前下订单购买相同的产品。

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

注意:在减少库存时使用Fobject from以减少 DB 值而不是实例属性的库存。django.models


推荐阅读