Django 1.6和嵌套“;使用transaction.atomic();
多年来,我已经习惯了使用Django<1.6手动执行较旧的transaction.commit_on_success和transaction.commit_。但是现在使用Django 1.6,旧的API主要被transaction.atomic替换 ,我仍然不确定以下代码将如何提交到数据库:Django 1.6和嵌套“;使用transaction.atomic();,django,django-models,transactions,django-database,Django,Django Models,Transactions,Django Database,多年来,我已经习惯了使用Django
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()从调用时,第三个函数失败