Почему .save() все еще занимает время при использовании transaction.atomic()?

В Django я прочитал, что transaction.atomic() должен оставлять все запросы выполняться до конца сегмента кода в одной транзакции. Однако, похоже, что это не работает так, как ожидалось:

import time
from django.db import transaction
my_objs=Obj.objects.all()[:100]
count=avg1=0
with transaction.atomic():
    for obj in my_objs:
        start = time.time()
        obj.save()
        end = time.time()
        avg1+= end - start
        count+= 1
print("total:",avg1,"average:",avg1/count)

Почему при обертывании метода .save() вокруг начального/конечного времени, чтобы проверить, сколько времени это занимает, оно не является мгновенным?

Результатом выполнения приведенного выше кода было:

total: 3.5636022090911865 average: 0.035636022090911865

При регистрации SQL-запросов с помощью отладчика он также отображает утверждение UPDATE для каждого вызова .save().

Есть идеи, почему он не работает так, как ожидалось?

PS. Я использую Postgres.

Вероятно, здесь имеет место непонимание того, что на самом деле делает transaction.atomic. Он не обязательно ожидает выполнения всех запросов - ORM все еще общается с базой данных, пока вы выполняете свой код в атомарном блоке. Он просто ожидает фиксировать (SQL COMMIT;) изменения до [успешного] завершения блока. В случае исключения до конца блока транзакции, все изменения в транзакции не фиксируются и откатываются назад.

Вернуться на верх