2016-09-05 2 views
3

Я использую команду Django для выполнения некоторых задач, связанных с базой данных манипуляций:Django: Как откат (@ transaction.atomic) без повышения исключения?

class SomeCommand(BaseCommand): 
    @transaction.atomic 
    def handle(self, *args, **options): 
     # Some stuff on the database 

Если исключение во время выполнения моей программы, @transaction.atomic гарантирует откатить. Могу ли я заставить это поведение исключать исключение? Что-то вроде:

# Doing some stuff, changing objects 

if some_condition: 
    # ABANDON ALL CHANGES AND RETURN 
+0

Я подозреваю, что нет никакого способа сделать это. Вам нужно будет сделать это с помощью исключения и поймать его тихо. Я создал подкласс temp-exception, поймал его и передал, все внутри «атомного» блока. – reformy

ответ

2

transaction.set_rollback может сделать это.

class SomeCommand(BaseCommand): 
    @transaction.atomic 
    def handle(self, *args, **options): 
     # Doing some stuff, changing objects 
     if some_condition: 
      # Return, rolling back transaction when atomic block exits 
      transaction.set_rollback(True) 
      return 

Цитируя the docs:

Установка флага отката True вынуждает откат при выходе из самого внутреннего атомного блока. Это может быть полезно для запуска отката без привлечения исключения.

-1

Просто позвоните transaction.rollback().

Вызов transaction.rollback() возвращает всю транзакцию. Любые операции с незафиксированными базами данных будут потеряны.

Вы можете увидеть пример в docs.

+2

Использование 'transaction.rollback()' вместе с 'transaction @ atomic' запрещено, поэтому, если исключение фактически выбрано где-то, отката не произойдет. – Siegmeyer

+0

Более того, django выдает ошибку при вызове 'rollback()' в блоке 'transaction.atomic'. Это просто не решение. – reformy

-1

Вы можете управлять выполнением кода, чтобы поднять или не исключение:

+0

В этом коде раздел «ваша логика здесь» будет привязан к БД. Нет отката здесь. – reformy

Смежные вопросы