Django中的并发管理
我正在开发一个用Django开发的web应用程序,它提供一个RESTAPI来订票。 为了做到这一点,我定义了一些通过ORM与数据库交互的视图。 我的应用程序有一些关键功能,比如预订功能 或多或少,它具有以下结构: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
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
,我忘记了这一点)。