停止Django Model函数一次运行多次

时间:2015-06-06 14:39:46

标签: python django django-models concurrency

我有一个预订位置的Django Model类。一旦我们拥有所有辅助数据并准备好付款,我们就会获得实时可用性并分配预订。整个过程的最后一步需要几秒钟(大多等待付款提供商清除)。在理论中,两次付款可以同时进行双重预订。

这些都由单个函数Booking.book()处理。是否有任何理智的方式我可以限制,以便只有一个实例可以同时工作而其他实例排队?

部署设计最初非常简单,但最终可能会扩展到多个服务器。

正确这样做的方式是什么?它的缺点是什么?

2 个答案:

答案 0 :(得分:0)

您可以做的是在付款开始后锁定预订的插槽。这样你只会“失去”一段时间的可用性。锁可以在保存其余信息的同一集中系统上完成。例如,您可以扩展应用程序服务器,但保留一个数据源入口点。 您在付款遭拒或确认后解除锁定。

答案 1 :(得分:0)

您可以像这样在产品中添加一个外键:

class Reservation(models.Model):
    reservations = ForeignKey(Book)
    quantity = models.IntegerField(default=0)
    creation = models.DateTimeField(auto_now_add)
    user = ForeignKey(User)

class Book(models.Model):
    ...

每当有人准备付款时,您都会为每种图书类型添加预订,并按数量减少您的Book.stock(对于此部分,如果您愿意,还可以使用"保留"列,或使用连接计算可用数量,但这最后会非常有效。

如果付款已经过验证,您只需删除预订条目,如果不是,则将您的库存退回。如果预订过期,您可以每隔几分钟获得一次cron,这将获得股票回报(使用创建字段)。