簡體   English   中英

Django:“我多久經常”需要@ transaction.atomic

[英]Django: “How often” do I need @transaction.atomic

原子塊可以嵌套。 在這種情況下,當內部塊成功完成時,如果稍后在外部塊中引發異常,則仍可以回滾其效果。

我是否正確理解在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()

這取決於你想要做什么。 你展示代碼的方式 - 你不需要在do_stuff上使用@transaction.atomic

但是,如果您希望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/

您使用的引用表示如果viewfunc引發異常,則無論do_stuff嵌套原子是否成功,都會發生回滾。
但是,如果do_stuffviewfunc引發異常,那么你假設viewfunc上的原子將處理回滾是viewfunc的。

我仍然會裝飾do_stuff以便您可以在viewfunc處理由它引發的異常,同時還可以回滾事務。 如果您只修飾viewfunc則錯誤可能會傳播並最終向用戶顯示500錯誤視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM