原子块可以嵌套。在这种情况下,当一个内部块 成功完成后,如果 稍后在外部块中引发异常。
我是否正确理解我不需要在@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()
答案 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
中嵌套原子的成功执行,都会发生回滚。
但是,是的,假设viewfunc
或do_stuff
引发异常时,viewfunc
上的原子将负责回滚是正确的。
我仍然会修饰do_stuff
,以便您可以处理viewfunc
中它引发的异常,同时回滚事务。
如果仅装饰viewfunc
,则错误可能会传播并最终向用户显示500错误视图。