Этот вопрос проверяет знание механизма транзакций в Django ORM и их использования для обеспечения целостности данных.
Транзакции в Django позволяют группировать несколько операций с базой данных в одну атомарную единицу работы. Они гарантируют, что либо все операции выполнятся, либо ни одна. Django предоставляет декораторы @transaction.atomic и менеджеры контекста для управления транзакциями.
Транзакции являются ключевым механизмом для обеспечения согласованности данных в приложениях.
Основные способы использования:
Декоратор @transaction.atomic:
from django.db import transaction
@transaction.atomic
def my_view(request):
# Весь код внутри функции будет выполнен в одной транзакции
obj = MyModel.objects.create(name="test")
obj.save()Менеджер контекста transaction.atomic:
from django.db import transaction
def my_view(request):
with transaction.atomic():
# Операции внутри блока выполняются в транзакции
obj = MyModel.objects.create(name="test")
obj.save()Особенности:
Транзакции поддерживаются только для баз данных, которые имеют транзакционность (например, PostgreSQL, MySQL с InnoDB).
В случае исключения внутри транзакции происходит автоматический откат (rollback).
Можно создавать точки сохранения (savepoints) внутри транзакции для частичного отката.
Пример с точкой сохранения:
with transaction.atomic():
obj1 = MyModel.objects.create(name="test1")
savepoint = transaction.savepoint()
try:
obj2 = MyModel.objects.create(name="test2")
# Если что-то пойдет не так, можно откатиться к savepoint
except Exception:
transaction.savepoint_rollback(savepoint)