作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Django 应用程序将对象保存到数据库和一个 celery 任务,它定期对其中一些对象进行一些处理。问题是用户可以在 celery 任务选择对象进行处理之后,但在 celery 任务实际完成处理并保存它之前删除该对象。所以当 celery 任务调用 .save()
时,即使用户删除了该对象,该对象也会重新出现在数据库中。当然,这对用户来说真的很可怕。
所以这是一些显示问题的代码:
def my_delete_view(request, pk):
thing = Thing.objects.get(pk=pk)
thing.delete()
return HttpResponseRedirect('yay')
@app.task
def my_periodic_task():
things = get_things_for_processing()
# if the delete happens anywhere between here and the .save(), we're hosed
for thing in things:
process_thing(thing) # could take a LONG time
thing.save()
@app.task
def my_periodic_task():
things = Thing.objects.filter(...some criteria...)
for thing in things:
process_thing(thing) # could take a LONG time
try:
with transaction.atomic():
# just see if it still exists:
unused = Thing.objects.select_for_update().get(pk=thing.pk)
# no exception means it exists. go ahead and save the
# processed version that has all of our updates.
thing.save()
except Thing.DoesNotExist:
logger.warning("Processed thing vanished")
process_thing
的用户编辑和编辑之间的竞争感到满意,我总是可以抛出
refresh_from_db
就在
process_thing
之前最大限度地减少用户编辑丢失的时间。但是我绝对不能让对象在用户删除它们后重新出现。
最佳答案
如果你在处理celery任务的时候开启一个事务,你应该避免这样的问题:
@app.task
@transaction.atomic
def my_periodic_task():
things = get_things_for_processing()
# if the delete happens anywhere between here and the .save(), we're hosed
for thing in things:
process_thing(thing) # could take a LONG time
thing.save()
select_for_update()
到您的查询集(最有可能在 get_things_for_processing 中),然后在负责删除的代码中,您需要在 db 报告特定记录被锁定时处理错误。
关于python - 如果对象已在 Django 中删除,如何更新对象或保释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234977/
我是一名优秀的程序员,十分优秀!