我正在使用PostgreSQL作为作业队列。以下是我的查询语句,用于检索作业并更新其状态:
UPDATE requests AS re
SET
started_at = NOW(),
finished_at = NULL
FROM (
SELECT
_re.*
FROM requests AS _re
WHERE
_re.state = 'pending'
AND
_re.started_at IS NULL
LIMIT 1
FOR UPDATE SKIP LOCKED
) AS sub
WHERE re.id = sub.id
RETURNING
sub.*
现在,我有几台机器,在每台机器上都有一个具有多个线程的进程,并且在每个线程上都有一个工作程序。同一进程中的所有工作程序共享一个连接池,通常有10-20个连接。问题是,以上查询将返回一些重复的行!
我找不到任何原因。有人可以帮忙吗?
更详细地说,我正在使用Python3和psycopg2。
更新:
我尝试了@a_horse_with_no_name的答案,但似乎不起作用。
我注意到,一个请求通过两个查询检索,并更新了
started_at
:2016-04-21 14:23:06.970897 + 08
和
2016-04-21 14:23:06.831345 + 08
只相差0.14秒。
我想知道在这两个连接执行内部SELECT子查询的时间,两个锁是否都没有建立?
更新:
更准确地说,我在1台机器上的1个进程中有200个工作程序(即200个线程)。