python - 并发支付控制
问题描述
当我点击“下订单”时,我已经开始交易并将列is_payment_processing设置为 True,然后将用户带到商家网站,然后可能存在三种可能性:
- 用户登陆成功回调页面
- 用户登陆失败回调页面
- 用户既没有成功也没有失败回调,因为他关闭了窗口。
在第三种情况下:产品将保持is_payment_processing为 True 的状态。并且,尝试签出同一产品的其他用户将无法这样做。但在这种情况下,我可能会失去一些客户,造成一些不便。
考虑每分钟运行一个 cron 作业,这将跟踪该列的最后修改时间,如果超过 3 分钟没有更改,则将该标志设置为 False。
这里最好的方法应该是什么?在一般情况下这是如何实现的?(并发控制)
另一个想法: 访问这个问题
解决方案
理想情况下,您的模型中应该有一个stock
字段Product
来保持该产品的可用数量。
当有人下订单时,order
应创建一个具有指定数量的单独实例Prodduct
。order
只有在收到回调或收到确认付款的 webhook后,才应减少库存。
这不会阻止其他客户在商品实际售出之前下订单购买相同的产品。
另一种方法可能是在客户进入回调页面时减少库存,如果在一定时间内未收到付款,则释放库存。为此将需要后台任务。
注意:在减少库存时使用F
object from以减少 DB 值而不是实例属性的库存。django.models
推荐阅读
- javascript - 首次提交时未显示验证错误消息
- javascript - Chromium 47.0.2518.0 未加载 javascript 文件
- c# - UWP“当前上下文中不存在名称调度程序”
- javascript - 自定义 javascript 正则表达式,如 wordpress 页面图块
- python - 以下 3 种方式在构造函数中声明属性有什么区别?
- php - Dockerfile 不安装 RUN 依赖项
- python - 使用 Active X 控制 LabView Vi 与开源 Python 自动化包的权衡/好处?
- linux - 如何从文本文件中读取文件名并在 linux 中更改其权限
- angular - Angular 6:无法正确设置 http Header 的 Content-Type
- javascript - 引入标记时,MD Edge 中具有缩放功能的 D3js 强制导向图崩溃