簡體   English   中英

Django和Sqlite並發問題

[英]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://code.djangoproject.com/ticket/9409

我的理解是只有寫操作才會導致數據庫鎖定狀態。 http://www.sqlite.org/lockingv3.html

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

從使用帶有標准cgi的sqlite開始,我注意到在某些情況下,釋放鎖可能需要很長時間。 您可能希望增加Matthew Christensen提到的超時值。

聽起來你實際上正在運行一個多線程應用程序,盡管你說的話。 我對Django有點無能為力,但我認為即使它可能是單線程的,無論是調試服務器,還是運行應用程序的生產服務器都不會“本質上是單線程的”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM