【问题标题】:Why doesn't this loop display an updated object count every five seconds?为什么这个循环不每五秒显示一次更新的对象计数?
【发布时间】:2011-01-14 08:12:48
【问题描述】:

我使用这个python代码每5秒输出一次Things的数量:

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

my_count() 

如果在 my_count() 运行时另一个进程生成了一个新事物,my_count() 将继续打印相同的数字,即使它现在在数据库中已更改。 (但如果我杀死 my_count() 并重新启动它,它将显示新的事物计数。)

东西存储在 MYSQL innodb 数据库中,这段代码在 ubuntu 上运行。

为什么 my_count() 不重新启动就不会显示新的 Thing.objects.count()?

【问题讨论】:

  • 黑暗中的一枪:你在使用交易吗?
  • Oggy:是的,我使用事务。

标签: python mysql django


【解决方案1】:

因为 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)

-- 请注意transaction.autocommit 装饰器仅用于进入事务管理模式(也可以使用 transaction.enter_transaction_management/leave_transaction_managemen 函数手动完成)。

还有一件事 - 要注意 - Django 的自动提交与您在数据库中的自动提交不同 - 它是完全独立的。但这超出了这个问题的范围。

于 2012 年 1 月 22 日编辑

Here 是类似问题的“双重答案”。

【讨论】:

  • 太棒了!我以为我永远找不到能告诉我如何解决这个问题的人!谢谢:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2020-08-28
相关资源
最近更新 更多