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错误视图