TransactionManagementError

Исключение TransactionManagementError выбрасывается, когда возникает проблема с управлением транзакциями базы данных в Django. Это исключение наследуется от django.db.DatabaseError и возникает в ситуациях неправильного использования транзакционных операций, таких как попытка выполнить commit или rollback вне контекста активной транзакции, а также при попытке выполнить запросы к базе данных после возникновения ошибки в транзакции без ее корректного завершения.

В Django транзакции управляются с помощью декоратора transaction.atomic или контекстного менеджера. Исключение возникает, например, при попытке сохранить изменения после того, как транзакция уже была отменена из-за ошибки, или при попытке использовать commit или rollback вне блока atomic.

Синтаксис

pythonfrom django.db import transaction, DatabaseError

try:
  with transaction.atomic():
    # Код, выполняющий операции с базой данных
    pass
except DatabaseError as e:
  # Обработка ошибок базы данных, включая TransactionManagementError
  pass

Пример . 1. Возникновение ошибки при попытке commit вне транзакции

Рассмотрим пример, когда возникает исключение TransactionManagementError при попытке выполнить commit вне блока atomic:

pythonfrom django.db import transaction, connection
from myapp.models import Article

try:
  # Попытка выполнить commit без активной транзакции
  connection.commit()
except transaction.TransactionManagementError as e:
  print(e)

Результат выполнения кода:

python"TransactionManagementError: This is not a transaction, cannot commit"

Пример . 2. Попытка выполнения запроса после ошибки в транзакции

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

pythonfrom django.db import transaction, IntegrityError
from myapp.models import Article

try:
  with transaction.atomic():
    # Создание статьи с некорректными данными
    Article.objects.create(title=None)
    # При попытке выполнить дополнительный запрос после ошибки
    Article.objects.create(title="New Article")
except (IntegrityError, transaction.TransactionManagementError) as e:
  print(e)

Результат выполнения кода:

python"TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block."

Пример . 3. Использование вложенных транзакций с неправильным сохранением

Использование transaction.atomic с параметром savepoint=False внутри другого блока может вызвать исключение:

pythonfrom django.db import transaction
from myapp.models import Article, Category

try:
  with transaction.atomic():
    category = Category.objects.create(name="Tech")
    
    # Использование savepoint=False внутри активной транзакции
    with transaction.atomic(savepoint=False):
      Article.objects.create(
        title="Django Guide",
        category=category
      )
except transaction.TransactionManagementError as e:
  print(e)

Результат выполнения кода:

python"TransactionManagementError: This is forbidden when an 'atomic' block is already active."

Смотрите также

  • исключение DatabaseError,
    базовое исключение для всех ошибок базы данных
  • исключение IntegrityError,
    возникающее при нарушении целостности данных
  • исключение OperationalError,
    возникающее при ошибках подключения к базе данных
  • исключение ProgrammingError,
    возникающее при синтаксических ошибках SQL