【发布时间】:2011-05-16 04:32:05
【问题描述】:
我有一个守护进程线程,它循环并执行以下查询:
try:
newsletter = self.session.query(models.Newsletter).\
filter(models.Newsletter.status == 'PROCESSING').\
limit(1).one()
except sa.orm.exc.NoResultFound:
self.logger.debug('No PROCESSING newsletters found. Sleeping...')
self.sleep()
return
# (...) more code to do with found newsletter
其中 sleep 方法只是在配置的时间内停止该线程的执行,并且 return 语句返回到主循环。但是我发现,如果我在守护进程运行时将任何时事通讯的状态更改为“正在处理”,则不会发生任何事情,即。查询仍然引发 NoResultFound。但是,如果我重新启动守护程序,它将找到时事通讯。所以我看到,这个查询的结果必须被缓存。我该怎么做才能使缓存无效? session.expire_all() 不起作用。我也可以在每次迭代时创建新的 Session() 对象,但不知道这是否是一个关于系统资源的好方法。
【问题讨论】:
-
您的错误假设。你知道你的数据库是如何序列化这两个事务的吗?你知道这两个事务涉及到哪些数据库锁吗?你怎么知道它是一个 SQLAlchemy 缓存?它很可能是一个数据库锁,它在查询完成之前阻止更新,因为查询取出了错误的锁。你有缓存的证据吗?或者这是一个猜测?
-
我没有任何证据。只是一个猜测。也许缓存是在其他地方完成的。使用 rollback() 似乎在这里工作。
-
更有可能是不是缓存,而是锁定。
-
我在这里遇到了完全相同的问题,我的结果由于某种原因没有更新,输出保持不变,奇怪的是它甚至发生在我尚未获取的记录上:/这是香草 SQLAlchemy
标签: python sql multithreading caching sqlalchemy