Могут ли несколько запросов Django `bulk_update` быть частью одной атомарной транзакции?

Могут ли несколько запросов Django bulk_update быть частью одной атомарной транзакции?

Обычно, когда мы хотим сохранить несколько моделей в одной атомарной транзакции, мы можем сделать что-то вроде этого:

def my_update(model_a, model_b, model_c, model_d):
    with transaction.atomic():
        model_a.save()
        model_b.save()
        model_c.save()
        model_d.save()

Подобным образом я хочу обновить большой набор моделей в одной атомарной транзакции, например так:

def my_bulk_update(models_a, fields_a, models_b, fields_b, models_c, fields_c, models_d, fields_d):
    with transaction.atomic():
        Model_A.objects.bulk_update(objs=models_a, fields=fields_a)
        Model_B.objects.bulk_update(objs=models_b, fields=fields_b)
        Model_C.objects.bulk_update(objs=models_c, fields=fields_c)
        Model_D.objects.bulk_update(objs=models_d, fields=fields_d)

Копаясь в коде bulk_update, я нашел следующий фрагмент:

        with transaction.atomic(using=self.db, savepoint=False):
            for pks, update_kwargs in updates:
                rows_updated += self.filter(pk__in=pks).update(**update_kwargs)

Это показывает, что обновления выполняются внутри атомарной транзакции. Это означает, что my_bulk_update имеет вложенную атомарную транзакцию, и я не знаю, как она будет себя вести. Итак, у меня есть несколько вопросов по этому поводу:

  1. Является ли my_bulk_update атомарной?
  2. Каково поведение вложенной транзакции?
  3. Может ли using=self.db означать, что вложенные транзакции будут игнорироваться?
Вернуться на верх