【问题标题】:Django long running task - Database consistancyDjango 长时间运行的任务 - 数据库一致性
【发布时间】:2014-06-11 13:34:47
【问题描述】:

我有一个在线程中运行的任务,该任务将在一段时间后保存其输入数据。 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()

【问题讨论】:

    标签: python django orm


    【解决方案1】:

    一般来说,如果你不想阻塞其他任务做长时间的操作,你希望这些操作是异步的。

    存在使用 Django 执行此类任务的库。最有名的大概是http://www.celeryproject.org/

    【讨论】:

    • 一个不错的项目。我在 celery 中看不到任何有助于事务/乐观锁定或部分保存的功能。仍然需要让事务运行或重新加载。我错过了什么吗?
    【解决方案2】:

    我建议通过Django QuerySet's update method 使用部分保存。 save method on instances 中有一个 update_fields 关键字参数,它将限制要保存的字段。但是,保存方法本身中的任何逻辑都可能依赖于其他数据是最新的。为此目的,有一个相对较新的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
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2011-10-15
      • 2010-10-06
      • 2017-10-22
      • 2014-07-29
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多