Что такое transaction.atomic в Django и для чего он используется

Ответ

transaction.atomic — это основной механизм в Django для обеспечения атомарности операций с базой данных. Он гарантирует, что блок кода будет выполнен в рамках одной транзакции: либо все операции в блоке успешно завершатся (COMMIT), либо, в случае возникновения исключения, все изменения будут отменены (ROLLBACK).

Это критически важно для поддержания целостности данных, особенно при выполнении нескольких связанных операций записи.

Как это работает:

atomic можно использовать как декоратор или как контекстный менеджер.

  1. Как декоратор (для 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')
  2. Как контекстный менеджер (предпочтительный способ):

    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 не изменится, так как вся транзакция будет отменена.