Откат Django не работает после второго objects.create не может создать запись - PullRequest
0 голосов
/ 25 октября 2018

Вот фрагмент кода вида:

@transaction.atomic()
def insert_in_sample_table(request):
    try:
        with transaction.atomic():
            insert_obj = SampleTable1.objects.create(fld_id=2, fld_name='abc')
            raise Exception ("This is manual exception")
            insert_obj2 = SampleTable2.objects.create(fld_id=1, fld_name='xyz')
        return HttpResponse("SUCCESS")
    except Exception as e:
        return HttpResponse(str(e))

Существует две модели:

  1. SampleTable1
  2. SampleTable2

Я вручную вызвал исключение после первого создания, и теперь я ожидаю, что изменения, сделанные в первой модели (SampleTable1), должны быть отменены.Но, к сожалению, я не вижу отката

Я добавил 'ATOMIC_REQUESTS': True, в DATABASE в файле settings.py

Я удалил

 @transaction.atomic()

и проверил,по-прежнему не выполняется откат.

Как выполнить откат первой транзакции базы данных?

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать декоратор '@action.atomic', например:

@transaction.atomic
def insert_in_sample_table(request):
    tra = transaction.savepoint()

    try:
         insert_obj = SampleTable1.objects.create(fld_id=2, fld_name='abc')
         insert_obj2 = SampleTable2.objects.create(fld_id=1, fld_name='xyz')

         transaction.savepoint_commit(tra)
         return HttpResponse("SUCCESS")
    except IntegrityError:
         transaction.savepoint_rollback(tra)
         return HttpResponse("DB ERROR")

Если вы используете несколько баз данных, вам нужно указать имя соединения и заменить строку:

with transaction.atomic():

Для этого:

with transaction.atomic(using='connection_name'):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...