在Django中管理并发

时间:2018-09-24 11:03:42

标签: django concurrency

我正在开发一个使用Django开发的网络应用程序,该应用程序提供Rest API以便预订票。 为了做到这一点,我定义了一些通过ORM与数据库交互的视图。 我的应用程序具有一些关键功能,例如预订功能。

或多或少,它具​​有以下结构:

def book(params...):
    # check ticket availability
    # define some stuff which will we added to the new ticket entity
    # save new ticket entity

我不知道Django如何管理并发性,因此,我担心是否有可能同时检查两个预订的可用性而只检查其中一个的可用性。

这种情况发生的可能性有多大?哪种是最好的解决方法?我曾考虑过将该功能定义为原子功能,但我不知道它对系统性能有多严重。

2 个答案:

答案 0 :(得分:1)

您应独占锁定资源,直到完成使用。如果在使用该对象时没有其他人可以获得该对象的锁,则可以确保该对象没有更改。

要获取资源锁,我们使用数据库锁。 在django中,我们将select_for_update()用于数据库锁定

选中此select_for_update()

例如:

entries = Entry.objects.select_for_update().filter(author=request.user)

所有匹配的条目将被锁定,直到交易块结束为止,这意味着将阻止其他交易更改或获取对其的锁定。

答案 1 :(得分:0)

您很担心,您有一个典型的并发问题。尽管Django已经通过在每个视图中本机使用原子系统(每个视图都是事务,因此可以保证完全成功运行或在出现异常情况下不执行任何操作)来为您提供帮助,但这并不能完全解决您的问题。

您必须保证每个read> process> write进程独立于其他进程运行,因此例如,如果在同一应用程序下有多个Django线程,则在调用“ book”函数时,应避免其他线程进入此功能(或至少是并发敏感部分)。您可以通过并发控制器(例如信号灯或监视器)来实现此目的。看看herehere

您的代码应类似于:

def book(params...):
    LOCK()
    # check ticket availability
    # define some stuff which will we added to the new ticket entity
    # save new ticket entity
    UNLOCK()