2009-02-21 101 views
4

我已經做了一些與sqlite併發問題有關的閱讀,但我沒有看到它們如何應用到Django,因爲它本質上是單線程的。我沒有使用任何多進程模塊。我對於併發編程絕對沒有經驗,所以如果有人能夠確定爲什麼下面的代碼導致OperationalError:'數據庫被鎖定',我將不勝感激。Django和Sqlite併發問題

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方法工作得很好,直到它從視圖模塊調用。在視圖中打開的數據庫是否有開放連接,防止從模型中寫入數據?有人解釋爲什麼這段代碼會出錯嗎?

+0

因此,每次您在視圖中調用add_active_residents時都會發生鎖定?什麼確切的線是拋出鎖異常(保存?)它是否發生在devserver中,或僅在生產環境中? – 2009-02-21 14:41:43

+0

這發生在devserver中,只有當視圖調用add_active_residents時纔會發生。從命令行調用add_active_residents不會出錯。 – 2009-02-22 03:26:15

回答

4

在下面的方法函數

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項目的FK。爲什麼要對相關項目進行額外查詢?

+0

SSA_Resident是SSA和Resident之間的Many2Many表,其中包含駐留和ssa對象。我假設這些對象需要被返回,以便將它們添加到Ovramt_Resident的許多關係中。 – 2009-02-21 03:28:29

1

聽起來就像你實際上在運行多線程應用程序,儘管你說了什麼。我對Django有點無知,但我認爲即使它可能是單線程的,無論您在哪個調試服務器或生產服務器上運行應用程序,都不會「天生就是單線程的」。

2

你使用Python 2.6嗎?

如果是這樣,這是(顯然)一個已知的問題,可以通過增加來緩解:

DATABASE_OPTIONS = {'timeout': 30} 

您settings.py

http://code.djangoproject.com/ticket/9409

2

我的理解是,只寫操作將導致db-locked情況。 http://www.sqlite.org/lockingv3.html

如果不知道django如何在內部處理sqlite,很難說出問題所在。

從使用sqlite和標準cgi說起,我注意到在某些情況下,釋放鎖可能需要很長時間。你可能想要增加Matthew Christensen提到的超時值。