Django嵌套事务 - "with transaction.atomic()"

Lar*_*ara 35 django transactions nested atomic

我想知道我是否有这样的事情:

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

def functionB():
    with transaction.atomic():
        #save another thing
Run Code Online (Sandbox Code Playgroud)

有人知道会发生什么吗?如果functionB失败,functionA也会回滚吗?

谢谢!

Kev*_*nry 36

是的,它会的.无论嵌套如何,如果异常退出原子块,它将回滚:

如果代码块成功完成,则更改将提交到数据库.如果存在异常,则回滚更改.

另请注意,外部块中的异常将导致内部块回滚,并且可以捕获内部块中的异常以防止外部块回滚.该文档解决了这些问题.(或者在这里查看有关嵌套事务的更全面的后续问题).

  • @JialinZou:没有冲突。如果您阅读文档中的该部分,您将看到对捕获数据库错误的“正确方法”的引用,其示例涉及捕获内部块中的异常。他们试图警告您不要捕获异常并尝试在损坏的状态下继续处理事务。正确的方法是用“atomic()”包装内部代码,以确保在继续之前回滚损坏的数据库操作。 (4认同)