我有django应用程序,通过fastcgi在lighttpd下运行。 FCGI运行脚本如下所示:Django多进程问题
python manage.py runfcgi socket=<path>/main.socket
method=prefork \
pidfile=<path>/server.pid \
minspare=5 maxspare=10 maxchildren=10 maxrequests=500 \
我使用SQLite。所以我有10个进程,它们都使用同一个数据库。接下来我有两个观点:
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()
,如果这个观点在两个不同的线程执行,有时我得到为MyModel例如在DB与ID = 1和更新或者参数1或参数2(但不能同时) - 这取决于其过程是第一个。 (当然在现实生活中ID变化,但有时2个进程使用相同的ID执行这两个视图)
问题是:我应该怎么做更新param1和param2的实例?我需要一些东西来合并不同进程中的更改。
一个决定是创建进程间锁定的对象,但在这种情况下,我会得到顺序执行的意见,他们将不能够同时执行,所以我要求帮助
DUPE的Django: How can I protect against concurrent modification of data base entries
SQLite通常被认为不适合作为测试环境之外的后端;迁移到PostgreSQL或MySQL将成为阻力最小的路径。 – 2010-05-26 18:21:40
[Django:如何防止数据库条目的并发修改]的可能重复(http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-数据库条目) – 2010-05-26 18:23:46
嗯...可能是这个讨论可以是有用的。我可以在我的模型中添加时间戳字段并在保存前更新它。成功更新意味着没有其他线程/进程没有改变我的对象,所以我可以调用save方法。但是,如果更新失败,这意味着其他线程或进程已经改变了它,我应该从数据库重新获取并尝试合并更改。我对吗? P.S:但是很奇怪,Django对解决这些问题没有任何帮助......所有的开发人员都可以发明自己的解决方案吗?这很奇怪 – iKiR 2010-05-27 05:41:18