Почему этот цикл не отображает обновленный счетчик объектов каждые пять секунд? - PullRequest
8 голосов
/ 08 февраля 2010

Я использую этот код Python для вывода количества вещей каждые 5 секунд:

def my_count():     
    while True:
        print "Number of Things: %d" % Thing.objects.count()
        time.sleep(5)

my_count() 

Если другой процесс генерирует новую вещь во время выполнения my_count (), my_count () будет продолжать печатать то же числохотя сейчас это изменилось в базе данных.(Но если я убью my_count () и перезапущу его, он отобразит новый счетчик Thing.)

Вещи хранятся в базе данных MYSQL innodb, и этот код выполняется в Ubuntu.

Почемуmy_count () не будет отображать новый Thing.objects.count () без перезапуска?

1 Ответ

16 голосов
/ 08 февраля 2010

Поскольку 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

Здесь является «двойным ответом» на аналогичный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...