Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中的并发管理_Django_Concurrency - Fatal编程技术网

Django中的并发管理

Django中的并发管理,django,concurrency,Django,Concurrency,我正在开发一个用Django开发的web应用程序,它提供一个RESTAPI来订票。 为了做到这一点,我定义了一些通过ORM与数据库交互的视图。 我的应用程序有一些关键功能,比如预订功能 或多或少,它具有以下结构: def book(params...): # check ticket availability # define some stuff which will we added to the new ticket entity # save new ticket

我正在开发一个用Django开发的web应用程序,它提供一个RESTAPI来订票。 为了做到这一点,我定义了一些通过ORM与数据库交互的视图。 我的应用程序有一些关键功能,比如预订功能

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

def book(params...):
    # check ticket availability
    # define some stuff which will we added to the new ticket entity
    # save new ticket entity
我不知道Django是如何管理并发性的,因此,我担心同时检查两个预订的可用性,而只检查其中一个预订的可用性


发生这种情况的可能性有多大?解决这种情况的最佳方法是什么?我曾考虑过将该函数定义为原子函数,但我不知道这对系统性能有多糟糕。

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

您必须保证每个读>进程>写进程独立于其他进程运行,因此,例如,如果在同一应用程序下有多个Django线程,那么在调用“book”函数时,您应该避免任何其他线程进入该函数(或至少是并发敏感部分)。您可以使用并发控制器(如信号灯或监视器)来实现这一点。看一看就知道了

您的代码应该类似于:

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

您应该以独占方式锁定资源,直到使用完为止。如果在您处理对象时,没有其他人可以获取该对象的锁,则可以确保该对象未被更改

要获取资源上的锁,我们使用数据库锁。 在django中,我们使用
选择\u进行更新()
进行数据库锁定

检查这个

例如:

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

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

默认情况下,Django在事务中包装视图:您的问题实在太广泛,无法回答,但是,是的,您肯定应该担心。Django依赖数据库来管理这一点,这意味着您确实需要了解数据库事务和锁。根据需要使用或锁定。@WillemVanOnsem:for的默认值实际上是
False
@KevinChristopherHenry:aarrgh,是的(在我做的一些项目中,它被设置为
TRUE
,我忘记了这一点)。