[英]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_stuff
或viewfunc
引發異常,那么你假設viewfunc
上的原子將處理回滾是viewfunc
的。
我仍然會裝飾do_stuff
以便您可以在viewfunc
處理由它引發的異常,同時還可以回滾事務。 如果您只修飾viewfunc
則錯誤可能會傳播並最終向用戶顯示500錯誤視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.