2013-01-07 44 views
3

我正在使用Gunicorn在Nginx上托管一个Flask应用程序 - 它通过SQLAlchemy连接到数据库。目前Gunicorn被配置为总共使用5名工人。Gunicorn,Flask和SQLAlchemy:并发请求

简而言之,当按下按钮时,应用程序将检查数据库以确保该项目可用,并且该项目是否将该项目提供给用户。

但是,当使用Gunicorn的5名工人时,如果两个用户同时按下按钮,他们都会被给予该项目。我把工人减少到1人,这个问题就消失了。我该如何着手解决这个问题?

回答

3

这似乎是一个标准的并发控制问题,而不是Gunicorn的问题。

这个问题可能是你的 “检查数据库” 是这样实现的:

assign_item(X项,用户U):

  1. 检查项X在一个查询可用
  2. 将项目X分配给用户U并返回该值。

假设两个用户(A和B)尝试权利要求项X的同时,使assign_item(X,A)是在工人#1和assign_item运行(X,B)是在工人#运行2。

工号1可能运行assign_item(X,A)的第一行,然后工号2运行assign_item(X,B)的第一行。此时,两个检查都返回True;该项目是可用的。所以现在两个工人都运行他们各自的下一个操作,并且都将相同的物品返回给用户。

使用数据库解决此问题的方法是在assign_item中使用BEGIN TRANSACTION和END TRANSACTION,确保两个操作都是以原子方式进行的。

这是一个众所周知的问题,进一步的信息可以在http://en.wikipedia.org/wiki/Concurrency_control

发现