gpt4 book ai didi

Django 1.6 和嵌套 "with transaction.atomic()"

转载 作者:行者123 更新时间:2023-12-04 12:21:43 25 4
gpt4 key购买 nike

多年来,我已经习惯了旧的 transaction.commit_on_success 和 transaction.commit_manually 与 Django < 1.6。但是现在在 Django 1.6 中,旧的 API 主要被 transaction.atomic 取代。

After reading the docs on the new API ,我仍然不确定以下代码将如何提交到数据库:

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

在此示例中,我们假设从 a_first_function 调用的 a_second_function_successful 成功并从模型创建/保存对象。在这个 second_function 成功之后,第三个函数立即被调用并失败。

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

如果第三个函数定义如下,现在会有什么不同吗:
@transaction.atomic
def a_third_function_fails():
do_something_wrong()

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

谢谢,

最佳答案

好吧,我想说的是,如果您没有任何 try except 块来捕获触发回滚的异常,则所有内容都将回滚,因为异常将传播到最顶层 with transaction.atomic()来自 a_first_function() ,即使它是从 a_third_function_fails() 提出的

但是,如果您要在 a_third_function_fails 中捕获异常这意味着您还必须执行以下操作:

def a_third_function_fails():
try:
with transaction.atomic():
do_something_wrong()
except:
pass

然后您将回滚第三个函数而不是第二个函数,因为您在调用 with transaction.atomic() 时隐式地创建了一个保存点。来自 a_third_function_fails .

关于Django 1.6 和嵌套 "with transaction.atomic()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20338179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com