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