Как вы откатываетесь во время сеанса оболочки Django после вызова DatabaseError?
Раньше я знал, как это сделать, но я забыл. Иногда, используя оболочку Django, вы делаете ошибку и заставляете транзакцию прерваться. После этого любые последующие запросы приведут к DatabaseError: текущая транзакция прерывается, команды игнорируются до конца транзакционного блока. Тем не менее, я думаю, что есть способ отменить транзакцию, когда это происходит вручную, поэтому вам не нужно перезапускать сеанс. Может ли кто-нибудь сказать мне, что это такое?
Этот отчет об ошибке (https://code.djangoproject.com/ticket/10813) ссылается на эту технику, но не объясняет ее. Запуск django.db.transaction.rollback приводит к "TransactionManagementError: этот код не находится под управлением транзакций".
Ответы
Ответ 1
Это происходит со мной все время при использовании Postgres, и это действительно раздражает.
Вы хотите:
from django.db import transaction
transaction.rollback()
В большинстве случаев это нормально (и, по моему опыту, безопасно игнорировать TransactionManagementError
).
Ответ 2
Это немного лучше, потому что вы не получаете трассировки стека TransactionManagementError
:
from django.db import transaction
transaction.rollback_unless_managed()