我在Postgres中使用SQL Alchemy。我有一个称为Jobs的表,其定义如下:
class Job(Base):
id = Column(Integer,primary_key=True)
processed = Column(Boolean,default=False)
data = Column(String)
让我们假设处理数据需要花费一分钟。我想产生多名工人,这些工人将工作从餐桌上拿下来并进行处理。当工人查询工作时,它将寻找当前未处理的第一个未处理的工作(顺序无关紧要)。
我当时在考虑将select
与with_for_update
一起使用来锁定将要处理的行,这样就不会产生与处理同一件事的工人冲突:
job_to_process = session.query(Job).filter_by(processed=False).with_for_update().first_or_none()
问题是,如果工作程序A启动,它将获得作业1,然后在工作程序A处理工作1的同时启动工作程序B,但是上述查询将尝试将工作1返回给工作程序B并失败,直到锁被解除。有什么方法可以使工作程序B运行上面的查询以返回未锁定的第一行并忽略锁定的行?