【发布时间】:2011-06-29 02:54:32
【问题描述】:
我有类似下面的代码在后台进程中运行:
def run()
while True:
objs = MyModel.objects.filter(last_updated < time.time() - FREQUENCY)
print objs
def update()
while True:
# some processing code
mymodel.last_updated = time.time()
mymodel.save()
上述函数在两个单独的线程中运行:update() 依次更新所有模型,而 run() 选择需要更新的模型。这一切都针对 MySQL 运行,而 MyModel 存在于 InnoDB 表中。
问题是 run() 总是看到 last_updated 的相同值。原因是它在事务内部并选择数据的一致快照。自然,我希望它选择最新的数据。如果我执行以下操作,它会起作用:
def run()
from django.db import connection
while True:
connection.connection.execute('SET autocommit = 1')
objs = MyModel.objects.filter(last_updated < time.time() - FREQUENCY)
print objs
但这意味着我每次都会执行一个额外的查询。最重要的是,如果在我设置 autocommit = 1 和以下选择之间的连接关闭,它将无法正常工作。
Postgres 很高兴地支持这一点:http://docs.djangoproject.com/en/dev/ref/databases/#autocommit-mode(至少根据文档),但是有没有办法为 MySQL 启用自动提交?
此外,由于它作为后台进程运行,因此不处理任何请求,也不涉及中间件。
【问题讨论】:
标签: mysql django django-models transactions