Django Невозможно выполнить откат с блоком try-исключений для транзакций атома c - PullRequest
1 голос
/ 20 февраля 2020

Один из моих взглядов в Django выполняет операции сохранения на 6-7 таблицах. Я хочу, чтобы эти транзакции были атомами c I, если 5-я или 6-я транзакция не удалась, я хочу откатить все предыдущие сохранения. Представление содержит блок try-исключения для обработки возникших исключений.

Это выглядит примерно так:

@transaction.atomic
def my_view(request):
    sid = transaction.savepoint()
    try:
        Table1.save()
        Table2.save()
        Table3.save()
        Table4.save()
        Table5.save()
        Table6.save()
        Table7.save()  # This might fail. In case of failure I want to rollback saves from Table1 to Table6

        transaction.savepoint_commit(sid)
    except Exception as e:
        print(str(e))
        transaction.savepoint_rollback(sid)
        return JsonResponse({"Status": 0, "Data": str(e)}) 

Я пробовал выше, а Table7.save () не удался и Откат Table1 to Table6 не произошел. Я хочу вернуть ответ JSON как {"Status": 0, Data: "Error That occurred"} во всех случаях. Я не хочу повторно вызывать исключение в блоке исключений, как это сделано в Эта ссылка

Что я должен сделать, чтобы вернуть правильный JSONResponse и откатить все в случае сбоя?

1 Ответ

1 голос
/ 20 февраля 2020

Как указано в ссылке :

транзакции.atomi c выполнит транзакцию в базе данных, если ваше представление выдаст ответ без ошибки. Поскольку вы сами ловите исключение, Django кажется, что ваше представление выполнено просто отлично. Если вы поймали исключение, вам нужно обработать его самостоятельно

Альтернативный подход - использовать transaction.atomic внутри with (в качестве диспетчера контекста), который обеспечит фиксацию или откат (снова предложено) по той же ссылке и объяснил здесь )

def my_view(request):
    try:
        with transaction.atomic():
            Table1.save()
            Table2.save()
            Table3.save()
            Table4.save()
            Table5.save()
            Table6.save()
            Table7.save()  # This might fail. In case of failure I want to rollback saves from Table1 to Table6

    except Exception as e:
        print(str(e))
        return JsonResponse({"Status": 0, "Data": str(e)}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...