Hob*_*use 8 python mysql django
我使用这个python代码每5秒输出一件事:
def my_count():
while True:
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)
my_count()
Run Code Online (Sandbox Code Playgroud)
如果另一个进程在my_count()运行时生成一个新的Thing,my_count()将继续打印相同的数字,即使它现在在数据库中已更改.(但是如果我杀了my_count()并重新启动它,它将显示新的Thing计数.)
东西存储在MYSQL innodb数据库中,此代码在ubuntu上运行.
为什么my_count()会在不重新启动的情况下显示新的Thing.objects.count()?
Tom*_*ski 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)
Run Code Online (Sandbox Code Playgroud)
- 请注意,transaction.autocommit装饰器仅用于进入事务管理模式(这也可以使用transaction.enter_transaction_management/leave_transaction_managemen函数手动完成).
还有一件事 - 需要注意的是 - Django的自动提交与数据库中的自动提交不同 - 它是完全独立的.但这超出了这个问题的范围.
这是对类似问题的"双重答案".