Django:“我多久一次”我需要@ transaction.atomic

时间:2019-04-19 14:00:59

标签: python django

  

原子块可以嵌套。在这种情况下,当一个内部块   成功完成后,如果   稍后在外部块中引发异常。

我是否正确理解我不需要在@transaction.atomic之前添加do_stuff()装饰器?如果do_staff更改了数据库并且发生了异常,则父view_func将负责回滚。

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

那不是不是,对吗?

from django.db import transaction

@transaction.atomic
def do_stuff():
    do_something_in_the_database()

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

2 个答案:

答案 0 :(得分:2)

这取决于您要尝试执行的操作。显示代码的方式-不需要@transaction.atomic上的do_stuff

但是,如果您希望do_stuff能够独立于viewfunc失败,则可以。

例如:

@transaction.atomic
def viewfunc(request):
    try:
        do_stuff()
    except Exception:
        handle_exception()
    do_other_stuff

在这种情况下,do_stuff中的失败将回滚该段,但不会取消外部事务。

您可以在此处查看更多详细信息:https://docs.djangoproject.com/en/2.2/topics/db/transactions/

答案 1 :(得分:1)

您使用的引号说如果viewfunc引发异常,无论do_stuff中嵌套原子的成功执行,都会发生回滚。
但是,是的,假设viewfuncdo_stuff引发异常时,viewfunc上的原子将负责回滚是正确的。

我仍然会修饰do_stuff,以便您可以处理viewfunc中它引发的异常,同时回滚事务。 如果仅装饰viewfunc,则错误可能会传播并最终向用户显示500错误视图。