database - Django - 保持基于 save() 的事务简短

标签 database django django-models transactions performance

作为 Django 模型的 save() 方法 are not lazy ,并且由于保持交易简短是一种普遍的良好做法,因此最好将保存推迟到交易 block 的末尾吗?

例如,代码示例 B 是否会比下面的代码示例 A 保持事务打开的时间更短?

代码示例 A:

from django.db import transaction
from my_app.models import MyModel

@transaction.commit_on_success
def model_altering_method():
    for inst in MyModel.objects.all()[0:5000]:
        inst.name = 'Joel Spolsky'
        # Some models independent time consuming operations...
        inst.save()

代码示例 B:

from django.db import transaction
from my_app.models import MyModel

@transaction.commit_on_success
def model_altering_method():
    instances_to_save = []
    for inst in MyModel.objects.all()[0:5000]:
        inst.name = 'Joel Spolsky'
        # Some models independent time consuming operations...
        instances_to_save.append(inst)

    for inst in instances_to_save:
        inst.save()

最佳答案

我不确定,但这是我的理论 - 我认为您的 commit_manually 装饰器将开始一个新事务,而不是在您进行第一次保存时让一个新事务出现。所以我的理论是,代码示例 B 会使事务打开的时间更长,因为它必须遍历模型列表两次。

同样,这只是一种理论 - 它也可能取决于您使用的 DBMS 以及实际事务何时开始(另一种理论)。

关于database - Django - 保持基于 save() 的事务简短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215833/

相关文章:

python - Django 出错时渲染管理表单

Django:用户之间的关系(存储唯一对/组合)

django - 如何计算django中某些if条件的字段平均值?

python - Django 使用错误的 python 版本运行

python - Java 风格文件结构中的 Django 模型

python - 了解 ndb 模型中的类 - GAE

database - 每个客户使用一个大型数据库或使用单个数据库

mysql - 如何从引用另一个表的 2 列聚合数据?

python - 如何存储大量实时 SNMP 数据

javascript - 提交后如何隐藏表单?