Почему .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;
) изменения до [успешного] завершения блока. В случае исключения до конца блока транзакции, все изменения в транзакции не фиксируются и откатываются назад.