Обычно транзакция должна уже откатываться, если внутри блока 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 тот факт, что возникла проблема.Это может привести к неожиданному поведению.