Django和Sqlite并发问题

时间:2009-02-21 02:48:28

标签: python django sqlite concurrency

我已经完成了一些与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方法正常工作,直到从视图模块调用它。是否在视图中打开了与数据库打开的连接,这会阻止从模型写入?有人解释为什么这段代码会出错?

4 个答案:

答案 0 :(得分: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。为什么要对相关项进行其他查询?

答案 1 :(得分:2)

您使用的是Python 2.6吗?

如果是这样,这(显然)是一个已知的问题,可以通过添加:

来缓解
DATABASE_OPTIONS = {'timeout': 30}

到你的settings.py

请参阅http://code.djangoproject.com/ticket/9409

答案 2 :(得分:2)

我的理解是只有写操作才会导致数据库锁定状态。 http://www.sqlite.org/lockingv3.html

如果不知道django如何在内部处理sqlite,很难说出问题是什么。

从使用带有标准cgi的sqlite开始,我注意到在某些情况下,释放锁可能需要很长时间。您可能希望增加Matthew Christensen提到的超时值。

答案 3 :(得分:1)

听起来你实际上正在运行一个多线程应用程序,不管你说什么。我对Django有点无能为力,但我认为即使它可能是单线程的,无论调试服务器,还是运行应用程序的生产服务器都不会“本质上是单线程的”。