Вот фрагмент кода представления:
@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))
Есть две модели:
SampleTable1
SampleTable2
Я вручную вызвал исключение после первого создания, и теперь я ожидаю, что изменения, сделанные в первой модели (SampleTable1), должны быть отменены. Но отката к сожалению не вижу
Я добавил 'ATOMIC_REQUESTS': True,
в БАЗУ ДАННЫХ в файле settings.py
Я удалил
@transaction.atomic()
и проверил, все равно не откатывается.
Как сделать откат первой транзакции базы данных?
Используемая база данных - Mysql
Вы должны быть более конкретными, потому что существует 2 типа баз данных MySQL, и django docs утверждает, что только 1 из них поддерживает транзакции. Вам нужно будет выяснить, используете ли вы «InnoDB» (более новый, с транзакциями) или «MyISAM» (более старый, НЕ поддерживает транзакции).
Я использую InnoDB, который на самом деле поддерживает откат
Я отредактировал свой вопрос. Проблема заключалась в том, что я не добавил «ATOMIC_REQUESTS»: True, в базу данных в файле settings.py. Но теперь после добавления ручного отката между двумя транзакциями я не вижу отката
Вы можете использовать декоратор '@ transaction.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'):
Привет, я добавил точки сохранения, но это все еще не работает. Первая транзакция базы данных не откатывается.
и если вы добавите еще одну строку исключения, чтобы зафиксировать общую ошибку except Exception:
transaction.savepoint_rollback(tra)
return HttpResponse("GENERAL ERROR")
Какую базу данных вы используете?