Django: многократное массовое создание в транзакции - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу сделать несколько массовых созданий (независимых) внутри транзакции.

            with transaction.atomic():
                if x:
                   X.objects.bulk_create(x_objs)
                if y:
                    Y.objects.bulk_create(y_objs)
                if z:
                    Z.objects.bulk_create(z_objs)


Теперь я хочу, чтобы X откатился, если произойдет сбой Y или Z.Как мне это сделать?

1 Ответ

0 голосов
/ 26 февраля 2019

Обычно транзакция должна уже откатываться, если внутри блока transaction.atomic() происходит исключение.

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

        with transaction.atomic():
            if x:
               X.objects.bulk_create(x_objs)
            try:
                if y:
                    Y.objects.bulk_create(y_objs)
                if z:
                    Z.objects.bulk_create(z_objs)
            except Exception: # Your exception
                transaction.rollback()

Хотя обычно вы не должны ловить исключения самостоятельно в блоке atomic(), так как тогда это не будет работать должным образом.

КогдаВыходя из атомарного блока, Django проверяет, будет ли он завершен нормально или за исключением, чтобы определить, фиксировать или откатывать.Если вы ловите и обрабатываете исключения внутри атомарного блока, вы можете скрыть от Django тот факт, что возникла проблема.Это может привести к неожиданному поведению.

...