Могут ли несколько запросов 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
имеет вложенную атомарную транзакцию, и я не знаю, как она будет себя вести. Итак, у меня есть несколько вопросов по этому поводу:
- Является ли
my_bulk_update
атомарной? - Каково поведение вложенной транзакции?
- Может ли
using=self.db
означать, что вложенные транзакции будут игнорироваться?