我正在使用Gunicorn在Nginx上託管一個Flask應用程序 - 它通過SQLAlchemy連接到數據庫。目前Gunicorn被配置爲總共使用5名工人。Gunicorn,Flask和SQLAlchemy:併發請求
簡而言之,當按下按鈕時,應用程序將檢查數據庫以確保該項目可用,並且該項目是否將該項目提供給用戶。
但是,當使用Gunicorn的5名工人時,如果兩個用戶同時按下按鈕,他們都會被給予該項目。我把工人減少到1人,這個問題就消失了。我該如何着手解決這個問題?
我正在使用Gunicorn在Nginx上託管一個Flask應用程序 - 它通過SQLAlchemy連接到數據庫。目前Gunicorn被配置爲總共使用5名工人。Gunicorn,Flask和SQLAlchemy:併發請求
簡而言之,當按下按鈕時,應用程序將檢查數據庫以確保該項目可用,並且該項目是否將該項目提供給用戶。
但是,當使用Gunicorn的5名工人時,如果兩個用戶同時按下按鈕,他們都會被給予該項目。我把工人減少到1人,這個問題就消失了。我該如何着手解決這個問題?
這似乎是一個標準的併發控制問題,而不是Gunicorn的問題。
這個問題可能是你的 「檢查數據庫」 是這樣實現的:
assign_item(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
發現