Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.6和嵌套“;使用transaction.atomic();_Django_Django Models_Transactions_Django Database - Fatal编程技术网

Django 1.6和嵌套“;使用transaction.atomic();

Django 1.6和嵌套“;使用transaction.atomic();,django,django-models,transactions,django-database,Django,Django Models,Transactions,Django Database,多年来,我已经习惯了使用Django

多年来,我已经习惯了使用Django<1.6手动执行较旧的transaction.commit_on_success和transaction.commit_。但是现在使用Django 1.6,旧的API主要被transaction.atomic替换

,我仍然不确定以下代码将如何提交到数据库:

def a_first_function():
    with transaction.atomic():
        a_second_function_successful()
        a_third_function_fails()

def a_second_function_successful():
    with transaction.atomic():
        do_something()

def a_third_function_fails():
    do_something_wrong()
在本例中,假设从第一个函数调用的第二个函数成功,并从模型中创建/保存对象。第二个函数成功后,立即调用第三个函数并失败

假设使用上下文管理器的transaction.atomic在第一个和第二个函数中都使用,那么在第二个函数中创建/修改的数据会发生什么情况呢。它会被提交到数据库吗?它会从第一个功能自动回滚吗?我的经验是,无论第二个函数如何,它都将被提交,但是,我希望它不会被提交

如果将第三个函数定义为以下函数,现在会有什么不同吗

@transaction.atomic
def a_third_function_fails():
    do_something_wrong()
或作为:

def a_third_function_fails():
    with transaction.atomic():
        do_something_wrong()

谢谢,

我想说的是,如果您没有尝试除块之外的任何方法来捕获触发回滚的异常,那么所有的异常都将回滚,因为异常将通过transaction.atomic()从
a_first_function()
传播到最顶层的
,即使它是从
a_第三个_function_fails()引发的

但是,如果要在
中捕获异常,第三个函数将失败,这意味着您还必须执行以下操作:

def a_third_function_fails():
    try:
        with transaction.atomic():
            do_something_wrong()
    except:
        pass
然后,您将回滚第三个函数,而不是第二个函数,因为当您使用transaction.atomic()从
调用
时,第三个函数失败