繁体   English   中英

在@commit_manually中嵌套@commit_on_success

[英]nested @commit_on_success in @commit_manually

我在几个脚本中使用以下实用程序功能:

@transaction.commit_on_success
def save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

在其中一个脚本中,我将许多这些模型实例上传到数据库。 为了提高效率,我尝试执行以下操作:

@transaction.commit_manually
def save_many(arg_list):
    for i,arg in enumerate(arg_list):
        save_something(arg)
        if i%1000==0:
            transaction.commit()

commit_manually是否覆盖commit_on_success
如果没有,我该怎么做?

看看这个片段,我认为它以更好的方式处理嵌套的提交http://djangosnippets.org/snippets/1343/

简短的回答是“否”和“您不能”。 装饰器(及其所做的全部工作)将它们装饰的函数包装在另一个函数中,该函数在必要时启动事务,然后调用原始函数。 这就是commit_manually装饰器的包装器函数所做的全部。 commit_on_success装饰器根据包装函数的成功添加自动提交或回滚。 装饰器不是被切换的“运行时标志”,而是其他行为被禁用。 它们只是一个包裹在您的函数中的小样板,并且commit_on_success装饰器的样板将始终是提交或回滚。

装饰者的来源可以告诉您更多有关手头细节的信息: https : //code.djangoproject.com/svn/django/trunk/django/db/transaction.py

您可以:

@transaction.commit_on_success
def save_something(arg):
    _save_something(arg)

def _save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

然后在确实需要它的免费装饰器的情况下,使用_save_something() ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM