为什么此循环不会每五秒显示一次更新的对象计数?

时间:2010-02-08 11:34:30

标签: python mysql django

我使用这个python代码每5秒输出一次事物:

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

my_count() 

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

事物存储在MYSQL innodb数据库中,此代码在ubuntu上运行。

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

1 个答案:

答案 0 :(得分:16)

因为默认情况下,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的自动提交与数据库中的自动提交不同 - 它完全独立。但这超出了这个问题的范围。

于12月22日编辑

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