我有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
答案 0 :(得分:1)
如果您需要对数据库进行此类并发访问,那么SQLite不是一个好选择。 我建议切换到其他一些rdbms,如MySQL或PostgreSQL, 并且还考虑了get_or_create脆弱性:
How do I deal with this race condition in django?
关于上述链接,还有第二个解决该问题的方法 - 使用READ COMMITED隔离级别,而不是REPEATABLE READ。但它的测试较少(至少在MySQL中),因此可能存在更多的错误/问题。