django多进程问题

时间:2010-05-26 18:16:55

标签: python django sqlite transactions

我有django应用程序,通过fastcgi在lighttpd下运行。 FCGI运行脚本如下所示:

python manage.py runfcgi socket=<path>/main.socket
    method=prefork \                                                                                                    
    pidfile=<path>/server.pid \                                                                                                                                        
    minspare=5 maxspare=10 maxchildren=10 maxrequests=500 \

我使用SQLite。所以我有10个进程,它们都使用相同的DB。接下来我有2个观点:

def view1(request)
    ...
    obj = MyModel.objects.get_or_create(id=1)
    obj.param1 = <some value>
    obj.save ()

def view2(request)
    ...
    obj = MyModel.objects.get_or_create(id=1)
    obj.param2 = <some value>
    obj.save ()

如果这个视图在两个不同的线程中执行,有时我会在ID为1的DB中获取MyModel实例并更新param1或param2(但不是两者) - 它取决于第一个进程。 (当然在现实生活中,id会发生变化,但有时候2个进程会以相同的id执行这两个视图)

问题是:如何通过更新的param1和param2来获取实例?我需要一些东西来合并不同过程中的变化。

一个决定是创建进程间锁定对象,但在这种情况下,我将获得序列执行视图,它们将无法同时执行,所以我请求帮助

DUPE OF Django: How can I protect against concurrent modification of data base entries

1 个答案:

答案 0 :(得分:1)

如果您需要对数据库进行此类并发访问,那么SQLite不是一个好选择。 我建议切换到其他一些rdbms,如MySQL或PostgreSQL, 并且还考虑了get_or_create脆弱性:

How do I deal with this race condition in django?

关于上述链接,还有第二个解决该问题的方法 - 使用READ COMMITED隔离级别,而不是REPEATABLE READ。但它的测试较少(至少在MySQL中),因此可能存在更多的错误/问题。