Как выполнить откат во время сеанса оболочки Django после вызова DatabaseError? - PullRequest
14 голосов
/ 02 сентября 2011

Раньше я знал, как это сделать, но я забыл. Иногда при использовании оболочки Django вы совершаете ошибку и вызываете прерывание транзакции. После этого любые последующие запросы приведут к DatabaseError: текущая транзакция отменяется, команды игнорируются до конца блока транзакции. Тем не менее, я думаю, что есть способ откатить транзакцию, когда это происходит вручную, поэтому вам не нужно перезапускать сеанс. Может кто-нибудь сказать мне, что это такое?

Этот отчет об ошибке (https://code.djangoproject.com/ticket/10813) содержит ссылку на метод, но не объясняет его. Запуск django.db.transaction.rollback приводит к «TransactionManagementError: Этот код не находится под управлением транзакциями».

Ответы [ 2 ]

20 голосов
/ 02 сентября 2011

Это происходит со мной все время при использовании Postgres, и это действительно раздражает.

Вы хотите:

from django.db import transaction
transaction.rollback()

В большинстве случаев это нормально (и по моему опыту, можно игнорировать TransactionManagementError).

7 голосов
/ 16 октября 2012

Это немного лучше, потому что вы не получаете трассировки стека около TransactionManagementError:

from django.db import transaction
transaction.rollback_unless_managed()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...