Django嵌套事务-“;使用transaction.atomic()”;

Django嵌套事务-“;使用transaction.atomic()”;,django,transactions,nested,atomic,Django,Transactions,Nested,Atomic,我想知道我是否有这样的东西: def functionA(): with transaction.atomic(): #save something functionB() def functionB(): with transaction.atomic(): #save another thing 有人知道会发生什么?如果functionB失败,functionA也会回滚吗 谢谢大家! 是的,会的。无论嵌套如何,如果原子块因异

我想知道我是否有这样的东西:

def functionA():
    with transaction.atomic():
        #save something
        functionB()

def functionB():
    with transaction.atomic():
        #save another thing
有人知道会发生什么?如果functionB失败,functionA也会回滚吗


谢谢大家!

是的,会的。无论嵌套如何,如果原子块因异常退出:

如果代码块成功完成,更改将提交到数据库。如果出现异常,将回滚更改


还要注意,外部块中的异常将导致内部块回滚,并且可以捕获内部块中的异常以防止外部块回滚。该文件解决了这些问题。(有关嵌套事务的更全面的后续问题,请参阅)。

记住,您也可以使用@transaction.atomic decorator。“可以捕获内部块中的异常以防止外部块回滚”这一部分似乎与“避免捕获原子内部的异常”的做法相冲突@JialinZou:没有冲突。如果您阅读文档中的这一部分,您将看到一个对捕获数据库错误的“正确方法”的引用,其示例涉及捕获内部块中的异常。他们试图警告您不要发生异常,并试图在中断状态下继续事务。正确的方法是使用
atomic()
包装内部代码,以确保在继续之前回滚损坏的数据库操作。感谢您的澄清!这很有帮助。