作为 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/