【发布时间】:2016-08-14 02:59:20
【问题描述】:
我使用 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.*
现在,我有几台机器,在每台机器上我有 1 个带有多个线程的进程,并且在每个线程上我有一个工人。同一进程中的所有工作人员共享一个连接池,通常有 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 个线程)。
【问题讨论】:
-
在 postgresql 9.1 中是否可以使用 FOR UPDATE SKIP LOCKED?我不这么认为
-
@e4c5,我使用的是 9.5
-
对不起,我以为我看到了 9.1
-
您的员工数量是否多于您的人脉数量?
标签: multithreading postgresql psycopg2