Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:“;多久一次;我需要@transaction.atomic吗_Python_Django - Fatal编程技术网

Python Django:“;多久一次;我需要@transaction.atomic吗

Python Django:“;多久一次;我需要@transaction.atomic吗,python,django,Python,Django,原子块可以嵌套。在这种情况下,当内部块 成功完成后,如果 稍后在外部块中引发异常 我是否正确理解在Do_stuff()之前不需要添加@transaction.atomic装饰程序?如果do_staff更改了数据库并发生异常,则父级view_func将负责回滚 from django.db import transaction @transaction.atomic def viewfunc(request): # This code executes inside a transact

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

我是否正确理解在
Do_stuff()
之前不需要添加
@transaction.atomic
装饰程序?如果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()

这取决于你想做什么。你显示代码的方式-不,你不需要
上的
@transaction.atomic

但是,如果您希望
dou_stuff
能够独立于
viewfunc
而失败,您可以这样做

例如:

@transaction.atomic
def viewfunc(request):
    try:
        do_stuff()
    except Exception:
        handle_exception()
    do_other_stuff
在这种情况下,
do_stuff
中的失败将回滚该段,但不会取消外部事务


您可以在此处看到更多详细信息:

您使用的引文指出,如果
viewfunc
引发异常,则将发生回滚,无论
do\u stuff
中的嵌套原子成功与否
但是,如果
do_stuff
viewfunc
引发异常,您的假设是正确的,即
viewfunc
上的原子将负责回滚

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