Ответ
transaction.atomic — это основной механизм в Django для обеспечения атомарности операций с базой данных. Он гарантирует, что блок кода будет выполнен в рамках одной транзакции: либо все операции в блоке успешно завершатся (COMMIT), либо, в случае возникновения исключения, все изменения будут отменены (ROLLBACK).
Это критически важно для поддержания целостности данных, особенно при выполнении нескольких связанных операций записи.
Как это работает:
atomic можно использовать как декоратор или как контекстный менеджер.
-
Как декоратор (для view):
from django.db import transaction from django.http import HttpResponse @transaction.atomic def my_view(request): # Все операции с БД здесь выполняются в одной транзакции do_something() do_another_thing() return HttpResponse('OK') -
Как контекстный менеджер (предпочтительный способ):
from django.db import transaction def transfer_funds(from_account, to_account, amount): try: with transaction.atomic(): # 1. Снимаем деньги с одного счета from_account.balance -= amount from_account.save() # Имитация ошибки # if True: raise ValueError("Ошибка транзакции!") # 2. Начисляем на другой to_account.balance += amount to_account.save() except Exception as e: # Если возникнет ошибка, изменения обоих счетов будут отменены print(f"Транзакция не удалась: {e}")
Если в примере выше раскомментировать строку с ValueError, баланс from_account не изменится, так как вся транзакция будет отменена.