Поскольку Python DB API по умолчанию находится в режиме AUTOCOMMIT = OFF и (по крайней мере, для MySQLdb) на уровне изоляции REPEATABLE READ. Это означает, что за кулисами у вас есть текущая транзакция базы данных (InnoDB - это транзакционный движок), в которой первый доступ к данной строке (или, может быть, даже к таблице, я не уверен) исправляет «представление» этого ресурса для оставшейся части сделка.
Чтобы предотвратить такое поведение, необходимо обновить текущую транзакцию:
from django.db import transaction
@transaction.autocommit
def my_count():
while True:
transaction.commit()
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)
- обратите внимание, что декоратор транзакции.autocommit предназначен только для входа в режим управления транзакциями (это также можно сделать вручную с помощью функций транзакции.enter_transaction_management / exit_transaction_managemen).
Еще одна вещь - знать, что автокоммит Django - это не тот автокоммит, который вы имеете в базе данных - он полностью независим. Но это выходит за рамки этого вопроса.
Отредактировано 22/01/2012
Здесь является «двойным ответом» на аналогичный вопрос.