[英]Django and Sqlite Concurrency issue
我已經做了一些與sqlite的並發問題有關的閱讀,但是我沒有看到他們如何應用於Django,因為它本身就是單線程的。 我也沒有使用任何多進程模塊。 我完全沒有並發編程的經驗,所以如果有人能夠確定以下代碼導致操作錯誤:'數據庫被鎖定',我將不勝感激。
views.py
def screening(request, ovramt=None):
errors = []
if request.method == "POST":
form = ScreeningForm(request.POST)
if form.is_valid():
print "Woo valid!!"
return HttpResponse()
else: # GET
if ovramt is None:
o = Ovramt.objects.select_related(depth=1).latest("date_completed")
print "found?"
print o.id
else:
try:
o = Ovramt.objects.select_related(depth=1).get(id=ovramt)
except:
errors.append("OVRAMT NOT FOUND")
if o.residents.count() <= 0:
o.add_active_residents()
residents = list(o.residents)
models.py
def add_active_residents(self):
ssa_res = SSA_Resident.objects.select_related(depth=1).filter(ssa=self.ssa, active=True)
for r in ssa_res:
self.residents.add(r.resident) # Fails Here
self.save()
add_active_residents方法正常工作,直到從視圖模塊調用它。 是否在視圖中打開了與數據庫打開的連接,這會阻止從模型寫入? 有人解釋為什么這段代碼會出錯?
在以下方法函數中
def add_active_residents(self):
ssa_res = SSA_Resident.objects.select_related(depth=1).filter(ssa=self.ssa, active=True)
for r in ssa_res:
self.residents.add(r.resident) # Fails Here
self.save()
為什么有select_related? 你只需要ssa_res
項目。 為什么要對相關項目進行額外查詢?
你在使用Python 2.6嗎?
如果是這樣,這(顯然)是一個已知的問題,可以通過添加以下內容來減輕:
DATABASE_OPTIONS = {'timeout': 30}
到您的settings.py
我的理解是只有寫操作才會導致數據庫鎖定狀態。 http://www.sqlite.org/lockingv3.html
如果不知道django如何在內部處理sqlite,很難說出問題是什么。
從使用帶有標准cgi的sqlite開始,我注意到在某些情況下,釋放鎖可能需要很長時間。 您可能希望增加Matthew Christensen提到的超時值。
聽起來你實際上正在運行一個多線程應用程序,盡管你說的話。 我對Django有點無能為力,但我認為即使它可能是單線程的,無論是調試服務器,還是運行應用程序的生產服務器都不會“本質上是單線程的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.