【发布时间】:2011-07-13 19:53:18
【问题描述】:
问题:信号接收器检查特定条件下是否存在模型条目,如果不存在,则创建一个新条目。在极少数情况下,条目被重复。
在接收函数内:
try:
my_instance = MyModel.objects.get(field1=value1, field2=sender)
except:
my_instance = MyModel(field1=value1, field2=sender)
my_instance.save()
这是get_or_create 的明显候选者,但除了清理该代码之外,使用get_or_create 是否有助于防止此问题?
信号是在用户操作后发送的,但我不认为原始请求被重复,因为这会触发其他操作。
在数千个实例中重复发生了几次。这是否一定是由多个请求引起的,还是可以通过某种方式创建重复线程?有没有办法——也许是细粒度的事务管理——来防止重复?
在 Apache2 上使用 Django 1.1、Python 2.4、PostgreSQL 8.1 和 mod_wsgi。
【问题讨论】:
-
删除我的答案,因为我没有解决线程安全问题。只是指出,在您的设置中,如果
MyModel曾经通过任何方式创建了重复项,那么当get返回MultipleObjectsReturned异常时,它将不断产生重复项。
标签: django transactions thread-safety django-signals django-database