簡體   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