Django嵌套了Transaction.atomic

时间:2015-01-15 21:47:14

标签: python django

阅读文档:https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic

我知道

atomic blocks can be nested. In this case, when an inner block completes successfully, its effects can still be rolled back if an exception is raised in the outer block at a later point.

但是,我的问题是对于如下代码结构:

@transaction.atomic
def A():
    ## something
    B()
    C()
    ## something

@transaction.atomic
def B(): 
    ## something

@transaction.atomic
def C():
    ## something

如果B和C都成功了,并且A在他们之后出错了,那么B和C会回来,对吗?

如果B成功,但C搞砸了,B会回滚吗?

关于维护此回滚功能的内存使用情况,上面的那个和下面的内容之间有什么区别:

@transaction.atomic
def A():
    B()
    C()

def B():
    ## something
def C():
    ## something 

我知道这两种结构处理不同的情况。我只是问,假设它们都成功(完全),内存使用级别有什么不同?

提前致谢。

1 个答案:

答案 0 :(得分:7)

  

如果B和C都成功了,并且A在他们之后出错了,那么B和C会回来,对吗?

是的,整个交易A将被回滚,包括B和C.

  

如果B成功,但C搞砸了,B会回滚吗?

同样,整个事务A将被回滚,包括B和C.

我不能说内存使用量是多少。这取决于您的数据库引擎和您正在运行的代码。除非你正在使用非常大的数据集,否则我不会担心它。如果您正在使用非常大的数据集,那么请进行实验!