Sql ast>=refreshFrequency)不是真的条件?我还将网页表添加到了我原来的问题帖子中。@m_vdbeek:我添加了一个替代解决方案和更多信息。 BEGIN ISOLATION LEVEL SERIALIZABLE; UPDATE web
Sql ast>=refreshFrequency)不是真的条件?我还将网页表添加到了我原来的问题帖子中。@m_vdbeek:我添加了一个替代解决方案和更多信息。 BEGIN ISOLATION LEVEL SERIALIZABLE; UPDATE web,sql,postgresql,concurrency,transactions,locking,Sql,Postgresql,Concurrency,Transactions,Locking,ast>=refreshFrequency)不是真的条件?我还将网页表添加到了我原来的问题帖子中。@m_vdbeek:我添加了一个替代解决方案和更多信息。 BEGIN ISOLATION LEVEL SERIALIZABLE; UPDATE webpages SET locked = TRUE WHERE url IN ( SELECT DISTINCT ON (source) url FROM webpa
ast>=refreshFrequency)不是真的条件?我还将
网页
表添加到了我原来的问题帖子中。@m_vdbeek:我添加了一个替代解决方案和更多信息。
BEGIN ISOLATION LEVEL SERIALIZABLE;
UPDATE webpages
SET locked = TRUE
WHERE url IN
(
SELECT DISTINCT ON (source) url
FROM webpages
WHERE
(
last IS NULL
OR
last < refreshFrequency
)
AND
locked = FALSE
LIMIT limit
)
RETURNING *;
COMMIT;
CREATE TABLE webpages (
last timestamp with time zone,
locked boolean DEFAULT false,
url text NOT NULL,
source character varying(255) PRIMARY KEY
);
UPDATE webpages
SET locked = TRUE
WHERE url IN
(
SELECT DISTINCT ON (source) url
FROM webpages
WHERE
(
last IS NULL
OR
last < refreshFrequency
)
AND
locked = FALSE
LIMIT limit
)
WHERE
(
last IS NULL
OR
last < refreshFrequency
)
AND
locked = FALSE
URL locked
----------------
A false
A true
UPDATE webpages
SET locked = TRUE
WHERE url IN ( 'A' )
CREATE TABLE source (
source_id serial NOT NULL PRIMARY KEY
, source text NOT NULL
);
CREATE TABLE webpage (
source_id int NOT NULL REFERENCES source
url text NOT NULL PRIMARY KEY
locked boolean NOT NULL DEFAULT false, -- may not be needed
last timestamp NOT NULL DEFAULT '-infinity' -- makes query simpler
);
UPDATE webpage w
SET locked = TRUE
FROM (
SELECT (SELECT url
FROM webpage
WHERE source_id = s.source_id
AND (last >= refreshFrequency) IS NOT TRUE
AND locked = FALSE
AND pg_try_advisory_xact_lock(url) -- only true is free
LIMIT 1 -- get 1 URL per source
) AS url
FROM (
SELECT source_id -- the FK column in webpage
FROM source
ORDER BY random()
LIMIT limit -- random selection of "limit" sources
) s
FOR UPDATE
) l
WHERE w.url = l.url
RETURNING *;
WITH RECURSIVE s AS (
SELECT source_id, row_number() OVER (ORDER BY random()) AS rn
FROM source -- you might exclude "empty" sources early ...
)
, page(source_id, rn, ct, url) AS (
SELECT 0, 0, 0, ''::text -- dummy init row
UNION ALL
SELECT s.source_id, s.rn
, CASE WHEN t.url <> ''
THEN p.ct + 1
ELSE p.ct END -- only inc. if url found last round
, (SELECT url
FROM webpage
WHERE source_id = t.source_id
AND (last >= refreshFrequency) IS NOT TRUE
AND locked = FALSE -- may not be needed
AND pg_try_advisory_xact_lock(url) -- only true is free
LIMIT 1 -- get 1 URL per source
) AS url -- try, may come up empty
FROM page p
JOIN s ON s.rn = p.rn + 1
WHERE CASE WHEN p.url <> ''
THEN p.ct + 1
ELSE p.ct END < limit -- your limit here
)
SELECT url
FROM page
WHERE url <> ''; -- exclude '' and NULL