Django长时间运行的任务 - 数据库一致性

时间:2014-06-11 13:34:48

标签: python django orm

我有一个在一个线程中运行的任务,它将在很长一段时间后保存其输入数据。 Django通常会保存可能在此期间发生变化的整个对象。我也不想运行该事务,因为它将失败或阻止其他任务。我的解决方案是重新加载数据并保存结果。这是要走的路还是有一些乐观的锁定方案,部分保存或我应该使用的其他东西?

我的解决方案:

with transaction.atomic():
    obj = mod.TheModel.objects.get(id=the_id)

# Work the task

with transaction.atomic():
    obj = mod.TheObject.objects.get(id=obj.id)
    obj.result = result
    obj.save()

2 个答案:

答案 0 :(得分:0)

通常,如果您不想阻止执行长时间操作的其他任务,您希望这些操作是异步的。

存在用Django执行此类任务的库。最着名的可能是http://www.celeryproject.org/

答案 1 :(得分:0)

我建议通过Django QuerySet's update method使用部分保存。 save method on instances中有一个update_fields关键字参数,用于限制要保存的字段。但是,save方法本身的任何逻辑都可能依赖于其他最新的数据。为此目的,有一个相对较新的instance update_from_db method。但是,如果您的保存方法没有被覆盖,那么两者都会产生完全相同的SQL。 update可以避免任何潜在的数据完整性问题。

示例:

num_changed = mod.TheObject.objects.filter(id=obj.id).update(result=result)
if num_changed == 0:
    # Handle as you would have handled DoesNotExist from your get call