2013-01-07 43 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

發現