Postgresql job_result有更多列未在此处显示处理结果。但是为什么不直接把它们添加到作业中呢?或者,如果您需要两个表,为什么不在完成后从作业中删除,而不是更新已处理的列? CREATE TABLE "job" ( "id" SERIAL, "pr

Postgresql job_result有更多列未在此处显示处理结果。但是为什么不直接把它们添加到作业中呢?或者,如果您需要两个表,为什么不在完成后从作业中删除,而不是更新已处理的列? CREATE TABLE "job" ( "id" SERIAL, "pr,postgresql,locking,queue,Postgresql,Locking,Queue,job_result有更多列未在此处显示处理结果。但是为什么不直接把它们添加到作业中呢?或者,如果您需要两个表,为什么不在完成后从作业中删除,而不是更新已处理的列? CREATE TABLE "job" ( "id" SERIAL, "processed" BOOLEAN NOT NULL, PRIMARY KEY("id") ); CREATE TABLE "job_result" ( "id" SERIAL, "job_id" INT NOT NULL

job_result有更多列未在此处显示处理结果。但是为什么不直接把它们添加到作业中呢?或者,如果您需要两个表,为什么不在完成后从
作业
中删除,而不是更新
已处理的
列? CREATE TABLE "job" ( "id" SERIAL, "processed" BOOLEAN NOT NULL, PRIMARY KEY("id") ); CREATE TABLE "job_result" ( "id" SERIAL, "job_id" INT NOT NULL, PRIMARY KEY("id") ); UPDATE job SET id = id WHERE id = ( SELECT MIN(id) FROM job WHERE processed = false AND pg_try_advisory_lock(id) = true ) AND processed = false RETURNING *
with job_update as (
    update job
    set processed = true
    where id = (
        select id
        from (
            select min(id)
            from job
            where processed = false
        ) s
        for update
    )
    returning id
)
insert into job_result (job_id)
select id
from job_update
UPDATE job 
SET processed = true 
WHERE id = 
(
    SELECT MIN(id) 
    FROM job
    WHERE processed = false AND pg_try_advisory_xact_lock(id) = true
)
AND processed = false
RETURNING id
UPDATE job
SET processed=true
WHERE id =
(
    SELECT id
    FROM job
    WHERE processed = false AND pg_try_advisory_xact_lock(id) = true 
    order by id limit 1 for update
)
RETURNING id
create index on job (id) where processed = false;