ipa*_*ola 4 mysql django transactions django-models
我有类似下面的代码在后台进程中运行:
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()
Run Code Online (Sandbox Code Playgroud)
上述函数在两个独立的线程中运行: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
Run Code Online (Sandbox Code Playgroud)
但这意味着我将每次执行一次额外的查询.最重要的是,如果连接在我设置autocommit = 1和下面的select之间关闭,它将无法工作.
Postgres很乐意支持这个:http://docs.djangoproject.com/en/dev/ref/databases/#autocommit-mode(至少根据文档),但是有没有办法为MySQL启用自动提交?
此外,由于它作为后台进程运行,因此不会处理任何请求,也不会涉及中间件.
小智 5
在Django中,我监听connection_created信号,一旦建立连接就发送"set autocommit = 1"语句.它工作正常!
from django.db.backends.signals import connection_created
from django.dispatch import receiver
@receiver(connection_created)
def connection_init(sender, connection, **kwargv):
connection.cursor().execute("SET autocommit=1")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |