我使用这个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()?
答案 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的自动提交与数据库中的自动提交不同 - 它完全独立。但这超出了这个问题的范围。
Here是对类似问题的“双重回答”。