Джанго: «Как часто» мне нужно @action.atomic - PullRequest
1 голос
/ 19 апреля 2019

атомные блоки могут быть вложенными.В этом случае, когда внутренний блок завершается успешно, его эффекты все еще можно откатить, если во внешнем блоке возникнет исключение на более позднем этапе.

Правильно ли я понимаю, что я ненужно добавить @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()

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Это зависит от того, что вы пытаетесь сделать.То, как вы показали код - нет, вам не нужно @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 голос
/ 19 апреля 2019

Используемая вами цитата говорит, что откат произойдет, если viewfunc вызовет исключение, независимо от успеха вложенного атома в do_stuff.
Но да, вы правы, предполагая, что атом наviewfunc позаботится об откате, если do_stuff или viewfunc вызовет исключение.

Я бы все равно украсил do_stuff, чтобы вы могли обрабатывать исключения, вызванные им в viewfunc, и одновременно откатывать транзакцию.Если вы украсите только viewfunc, ошибка может распространиться и в конечном итоге отобразить пользователю представление с 500 ошибками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...