在@commit_manually中嵌套@commit_on_success

时间:2012-03-26 09:15:50

标签: python django transactions django-database

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

@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
如果没有,我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

简短的回答是“不”,“你不能”。装饰器(以及它们真正可以做的所有)是将它们装饰的函数包装在另一个在必要时启动事务的函数中,然后调用原始函数。这就是所有commit_manually装饰器的包装函数。 commit_on_success装饰器根据包装函数的成功添加自动提交或回滚。装饰器不是“运行时标志”,它们会被切换,而其他行为则会关闭。它们只是一个包围你的函数的小样板,commit_on_success装饰器的样板将始终提交或回滚。

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

答案 2 :(得分:0)

你可以:

@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() ......