【发布时间】:2019-12-26 13:22:59
【问题描述】:
我正在开发一些代码,我需要在数据库中保存大量数据。响应大约需要一分钟或更长时间。所以我决定在 celery 任务中移动该代码。我有一个叫做芹菜任务的观点。 这里的问题是,如果 celery 任务仍在为数据库中的同一条记录运行,您不应该能够从该视图接收状态 200。
我使用 select_for_update 语句进行行级锁定,例如:
site = self.get_object()
try:
with transaction.atomic():
Site.objects.select_for_update(nowait=True).filter(pk=site.pk)
except DatabaseError:
raise ObjectLockedException
在视图中,并且:
with transaction.atomic():
models.Site.objects.select_for_update(nowait=True).get(pk=site_id)
....
在任务中。如您所见,代码是相同的。
我的预期结果是,如果 celery 任务已启动并获得具有 site_id 的特定站点的锁定但尚未完成,我应该在指定视图中捕获 DatabaseError。 情况并非如此,即使同一站点的任务仍在运行,视图中的 select_for_update 也会毫无例外地通过。
另外一个好笑的是,在serializer.save()上,在代码的第一个sn-p下面,在指定的视图中,我的代码等待任务完成处理。
我做错了吗?
【问题讨论】:
标签: python-2.7 celery django-1.11