【问题标题】:Django: "How often" do I need @transaction.atomicDjango:“多久”我需要@transaction.atomic
【发布时间】:2019-09-09 19:06:59
【问题描述】:

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

我是否正确理解我不需要在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()

【问题讨论】:

    标签: python django


    【解决方案1】:

    这取决于你想要做什么。您显示代码的方式 - 不,您不需要 @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/

    【讨论】:

      【解决方案2】:

      您使用的引用说,如果viewfunc 引发异常,则将发生回滚,无论do_stuff 中的嵌套原子是否成功。
      但是,是的,您的假设是正确的,如果do_stuffviewfunc 引发异常,viewfunc 上的原子将负责回滚。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2017-08-25
        • 1970-01-01
        • 2015-01-25
        • 2022-01-10
        • 2012-03-01
        • 2017-04-07
        相关资源
        最近更新 更多